设置作为parameter passing的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'); 

在咖啡文本中,您可以访问有条件的存在操作符,所以可以这样做:

 param.lastName ?= 'smith' 

其中编译的JavaScript:

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

诀窍是首先在括号中join你想从参数对象中select的key=value ,其中key=value表示任何默认值。 跟着:和一个types声明。

这与你所要做的有点不同,因为不是有一个完整的params对象,而是有一个取消引用的variables。

如果你想使任何东西传递给函数,添加一个? 对于types中的所有键,并在types声明后添加={}的默认值:

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

不,TypeScript没有一种自然的方式来设置对象的属性的默认值,如其中一个默认值,另一个没有默认值。 你可以定义一个更丰富的结构:

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

并用它代替内联types定义。

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

因为只有name undefined它才会设置默认值。

解构参数对象的对象是上面许多答案的目标,而Typescript现在已经有了方法来使它更易于阅读和直观理解。

解构基础:通过解构一个对象,你可以通过键名从对象中select属性。 您可以定义您喜欢的属性的数量或数量,默认值由let {key = default} = object的基本语法设置。

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

编写参数对象的接口,types或类提高了易读性。

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

这可以是一个不涉及长构造函数的好方法

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

Typescript现在支持默认参数:

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

另外,添加默认值可以省略types声明,因为它可以从默认值推断出来:

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