Programing

인수로 전달 된 TypeScript 객체의 기본값 설정

lottogame 2020. 6. 20. 10:46
반응형

인수로 전달 된 TypeScript 객체의 기본값 설정


function sayName(params: {firstName: string; lastName?: string}) {
    params.lastName = params.lastName || 'smith';  // <<-- any better alternative to this?
    var name = params.firstName + params.lastName
    alert(name);
}

sayName({firstName: 'bob'});

나는 이런 식으로 작동한다고 상상했다.

function sayName(params: {firstName: string; lastName: string = 'smith'}) {

분명히 이것이 명백한 주장이라면 다음과 같이 할 수 있습니다.

function sayName(firstName: string, lastName = 'smith') {
    var name = firstName + lastName;
    alert(name);
}

sayName('bob');

그리고 coffeescript에서 조건부 존재 연산자에 액세스 할 수 있습니다.

param.lastName ?= 'smith'

다음은 자바 스크립트로 컴파일됩니다.

if (param.lastName == null) {
    param.lastName = 'smith';
}

실제로는 간단한 방법이 있습니다. 다음 코드는 TypeScript 1.5에서 작동합니다.

function sayName({first,last='Smith'}: {first: string; last?: string}){
    var name = first + " " + last;
    alert(name);
}

sayName({firstName: 'Bob'});

트릭은 먼저 key=value기본적으로 인수 객체에서 선택하려는 키를 괄호로 묶는 것 입니다. 와 그 수행 :과 유형 선언을.

이것은 온전한 params객체 대신에 역 참조 된 변수를 가지고 있기 때문에 수행하려는 것과 약간 다릅니다 .

선택적으로 함수에 무엇이든 전달 ?하려면 유형의 모든 키에 대해 a 를 추가 ={}하고 유형 선언 뒤에 기본값을 추가하십시오 .

function sayName({first='Bob',last='Smith'}: {first?: string; last?: string}={}){
    var name = first + " " + last;
    alert(name);
}

sayName();

Typescript는 현재 기본 매개 변수를 지원합니다.

https://www.typescriptlang.org/docs/handbook/functions.html

또한 기본값을 추가하면 형식 선언을 기본값에서 유추 할 수 있으므로 형식 선언을 생략 할 수 있습니다.

function sayName(firstName: string, lastName = "Smith") {
  const name = firstName + ' ' + lastName;
  alert(name);
}

sayName('Bob');

아니요, TypeScript에는 하나의 기본값이 있고 다른 하나는 그렇지 않은 것처럼 정의 된 객체의 속성에 대한 기본값을 설정하는 자연스러운 방법이 없습니다. 보다 풍부한 구조를 정의 할 수 있습니다.

class Name {
    constructor(public first : string, 
        public last: string = "Smith") {

    }
}

인라인 유형 정의 대신 사용하십시오.

function sayName(name: Name) {
    alert(name.first + " " + name.last);
}

불행히도 이와 같은 것을 할 수 없습니다 :

function sayName(name : { first: string; last?:string } 
       /* and then assign a default object matching the signature */  
       = { first: null, last: 'Smith' }) {

} 

namewas 인 경우에만 기본값을 설정합니다 undefined.


Object destructuring the parameter object is what many of the answers above are aiming for and Typescript now has the methods in place to make it much easier to read and intuitively understand.

Destructuring Basics: By destructuring an object, you can choose properties from an object by key name. You can define as few or as many of the properties you like, and default values are set by a basic syntax of let {key = default} = object.

let {firstName, lastName = 'Smith'} = myParamsObject;

//Compiles to:
var firstName = myParamsObject.firstName, 
_a = myParamsObject.lastName, 
lastName = _a === void 0 ? 'Smith' : _a;

Writing an interface, type or class for the parameter object improves legibility.

type FullName = {
  firstName: string;
   
  /** @default 'Smith' */
  lastName ? : string;
}

function sayName(params: FullName) {

  // Set defaults for parameter object
  var { firstName, lastName = 'Smith'} = params;

  // Do Stuff
  var name = firstName + " " + lastName;
  alert(name);
}

// Use it
sayName({
  firstName: 'Bob'
});


This can be a nice way to do it that does not involve long constructors

class Person {
    firstName?: string = 'Bob';
    lastName?: string = 'Smith';

    // Pass in this class as the required params
    constructor(params: Person) {
        // object.assign will overwrite defaults if params exist
        Object.assign(this, params)
    }
}

// you can still use the typing 
function sayName(params: Person){ 
    let name = params.firstName + params.lastName
    alert(name)
}

// you do have to call new but for my use case this felt better
sayName(new Person({firstName: 'Gordon'}))
sayName(new Person({lastName: 'Thomas'}))

참고URL : https://stackoverflow.com/questions/23314806/setting-default-value-for-typescript-object-passed-as-argument

반응형