AJP*_*AJP 147 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'});
Run Code Online (Sandbox Code Playgroud)
我曾经想象过这样的事情可能有用:
function sayName(params: {firstName: string; lastName: string = 'smith'}) {
Run Code Online (Sandbox Code Playgroud)
显然,如果这些是明确的论据,你可以这样做:
function sayName(firstName: string, lastName = 'smith') {
var name = firstName + lastName;
alert(name);
}
sayName('bob');
Run Code Online (Sandbox Code Playgroud)
在coffeescript中,您可以访问条件存在运算符,因此可以执行以下操作:
param.lastName ?= 'smith'
Run Code Online (Sandbox Code Playgroud)
哪个编译成javascript:
if (param.lastName == null) {
param.lastName = 'smith';
}
Run Code Online (Sandbox Code Playgroud)
jpa*_*dvo 161
实际上,现在似乎有一种简单的方法.以下代码适用于TypeScript 1.5:
function sayName({first,last='Smith'}: {first: string; last?: string}){
var name = first + " " + last;
alert(name);
}
sayName({firstName: 'Bob'});
Run Code Online (Sandbox Code Playgroud)
诀窍是首先在括号中放入要从参数对象中选择的键,key=value对于任何默认值.使用:和类型声明跟随它.
这与您尝试执行的操作略有不同,因为params您不是拥有完整的对象,而是使用解除引用的变量.
如果要使其可选地将任何内容传递给函数,请?为类型中的所有键添加一个,并={}在类型声明后添加默认值:
function sayName({first='Bob',last='Smith'}: {first?: string; last?: string}={}){
var name = first + " " + last;
alert(name);
}
sayName();
Run Code Online (Sandbox Code Playgroud)
enc*_*est 42
Typescript现在支持默认参数:
https://www.typescriptlang.org/docs/handbook/functions.html
此外,添加默认值允许您省略类型声明,因为它可以从默认值推断:
function sayName(firstName: string, lastName = "Smith") {
const name = firstName + ' ' + lastName;
alert(name);
}
sayName('Bob');
Run Code Online (Sandbox Code Playgroud)
Wir*_*rie 23
不,TypeScript没有一种自然的方法来为一个对象的属性设置默认值,就像一个对象具有默认值而另一个没有默认值.您可以定义更丰富的结构:
class Name {
constructor(public first : string,
public last: string = "Smith") {
}
}
Run Code Online (Sandbox Code Playgroud)
并使用它代替内联类型定义.
function sayName(name: Name) {
alert(name.first + " " + name.last);
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,你不能做这样的事情:
function sayName(name : { first: string; last?:string }
/* and then assign a default object matching the signature */
= { first: null, last: 'Smith' }) {
}
Run Code Online (Sandbox Code Playgroud)
由于它只会设置默认值,如果name是undefined.
Ben*_*son 22
对象解构参数对象是上面的许多答案的目标,而现在,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;
Run Code Online (Sandbox Code Playgroud)
为参数对象编写接口,类型或类可以提高易读性.
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'
});Run Code Online (Sandbox Code Playgroud)
Cam*_*ron 17
这可能是一个不需要长构造函数的好方法
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'}))
Run Code Online (Sandbox Code Playgroud)
这里有一些可以尝试的方法,使用接口和使用默认值进行解构。请注意,“姓氏”是可选的。
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" })
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
137070 次 |
| 最近记录: |