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