[typescript] 인수로 전달 된 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 }): void {
  const name = first + ' ' + last;
  console.log(name);
}

sayName({ first: '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는 이제 훨씬 쉽게 읽고 직관적으로 이해할 수있는 방법을 갖추고 있습니다.

파괴 기본 사항 : 오브젝트를 파괴함으로써 키 이름으로 오브젝트에서 속성을 선택할 수 있습니다. 원하는만큼 속성을 정의 할 수 있으며 기본값은의 기본 구문으로 설정됩니다 let {key = default} = object.

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

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

매개 변수 객체에 대한 인터페이스, 유형 또는 클래스를 작성하면 가독성이 향상됩니다.

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'
});


답변

아니요, 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.


답변

이것은 긴 생성자를 포함하지 않는 좋은 방법 일 수 있습니다.

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'}))


답변

다음은 인터페이스를 사용하고 기본값으로 파괴하는 것입니다. “lastName”은 선택 사항입니다.

interface IName {
  firstName: string
  lastName?: string
}

function sayName(params: IName) {
  const { firstName, lastName = "Smith" } = params
  const fullName = `${firstName} ${lastName}`

  console.log("FullName-> ", fullName)
}

sayName({ firstName: "Bob" })


답변

파괴하지 않고도 기본 매개 변수를 만들어 전달할 수 있습니다

interface Name {
   firstName: string;
   lastName: string;
}

export const defaultName extends Omit<Name, 'firstName'> {
    lastName: 'Smith'
}

sayName({ ...defaultName, firstName: 'Bob' })