2014-04-26 7 views
64
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'; 
} 
+0

귀하의 제안 솔루션'params.lastName = params.lastName || :이 기본 값에서 유추 할 수 있기 때문에 (210)는 또한, 기본 값을 추가하면, 당신은 유형 선언을 생략 할 수 있습니다 'smith';는 실제로는 꽤 괜찮습니다. 빈 문자열, 정의되지 않은 문자열 및 null 값을 처리합니다. – Fenton

+0

@SteveFenton 그리고 아무것도 위증 해. 성의 경우에는 문제가 없지만 일반적으로 좋은 아이디어는 아닙니다. 그래서 Typescript는 기본값을'if (typeof x === "undefined") {...}'로 변환합니다. 당신은 그것을 모르는 것이 아니라 OP에 대한 일반적인 경우를 지적합니다. –

+1

@ IngoBürk 사실이지만 'lastName ?: string'으로 인해 SteveFenton이 "빈 문자열, 정의되지 않은 문자열 및 null 값을 처리합니다"라고만 말할 수 있습니다. – AJP

답변

69

사실, 지금은 간단한 방법이 있습니다. 다음 코드는 타이프 1.5에서 작동 :

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

sayName({firstName: 'Bob'}); 

트릭 먼저 당신이 어떤 기본값에 대한 key=value로, 인수 대상에서 선택하고 싶은 키를 괄호에 넣어하는 것입니다. : 및 형식 선언을 사용하십시오.

이것은 원래 의도 한 것과 약간 다릅니다. params 개체를 그대로 사용하는 대신 역 참조 된 변수가 있기 때문입니다.

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

sayName(); 
+0

그 해결책은 매개 변수가 완전히 파괴 된 것을 보여주기 때문에 * interetsting * 코드 힌팅/인텔리 센스 기능을 만듭니다. 예제에서와 같이 몇 가지 매개 변수 이상으로 설정 객체에서 해당 스타일을 보길 기대하지는 않습니다. – WiredPrairie

+1

"sayNameSettings"와 같은 인터페이스/클래스를 대신 사용하도록이 솔루션을 다시 작성할 수도 있습니까? –

+1

이 방법을 사용하면이 방법으로 인수를 파괴하면 IMO를 따르기가 어려워집니다. –

16

아니, 타이프 라이터는 다음과 같이 정의 객체의 속성에 대한 기본값을 설정하는 자연적인 방법을 가지고 있지 않는 사람은 기본을 가지고 있으며, 다른 하나는하지 않는 곳. 더 풍부한 구조를 정의 할 수 있습니다 :

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

} 

nameundefined 인 경우에만 기본 설정 하듯이.

10

Object destructuring 매개 변수 개체 :

당신이 선택 유형에서 모든 키에 대한 ?를 추가, 함수에 아무것도 통과 할 수 있도록하고, 유형 선언 후 ={}의 기본을 추가하려면

위의 답변 중 많은 부분이 목표이며 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' 
 
});

9

이 긴 생성자

을 포함하지 않는 그것을 할 수있는 좋은 방법이 될 수 있습니다
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'})) 
+0

불행히도 요청자가 요청한대로 기본 값을 허용하지 않는다고 생각하지 않는다. –

+0

@PWKad 두 번째 및 세 번째 줄 "Bob"및 "Smith"에 기본값이 설정됩니다. – Cameron

12

타이프 라이터는 이제 기본 매개 변수를 지원합니다 :

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

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

sayName('Bob'); 
+0

인수로 전달 된 TypeScript 개체의 기본값과 관련하여 OP의 질문에 어떻게 적용됩니까? 당신은 객체 인자를 가진 예제를 보여줘야한다. – demisx

+0

그것은 아니지만, 일반적으로 타이프 스크립트에서 기본 매개 변수를 제공하는 방법을 검색 할 때이 질문을 발견했습니다. 또한 미묘한 "객체"매개 변수 설명을 알아 차리기 전에이 응답을 게시했습니다. – encrest