《TypeScript实战指南》—2.3.2 参数
2.3.2 参数
1.可选参数
TypeScript里的每个函数参数都必须有值。当然,如果允许的话,我们也可以传递 undefined 或者 null值,这里强调参数必须一一对应,占住坑,如下所示:
function buildName(firstName: string, lastName: string) {
return firstName + " " + lastName;
}
let name1 = buildName("Barack");
// [ts] Expected 2 arguments, but got 1.
let name2 = buildName("Barack", "Obama", "Sr.");
// [ts] Expected 2 arguments, but got 3.
let name3 = buildName("Barack", "Obama");
参数多一个或者少一个都是不能通过编译时检查的,如果我们希望后续的参数是可选的,可以使用之前出现过的问号,如下所示:
function buildName(firstName: string, lastName?: string) {
if (lastName) {
return firstName + " " + lastName;
}
else {
return firstName;
}
}
let name1 = buildName("Barack");
let name2 = buildName("Barack", "Obama", "Sr.");
// [ts] Expected 2 arguments, but got 3.
let name3 = buildName("Barack", "Obama");
可选参数必须跟在必要参数的后面,如果想让first name是可选的,那么就必须调整参数位置,把first name放在最后面。
2.默认参数
在TypeScript里,我们也可以为参数提供一个默认值。当用户没有传递这个参数或传递的值是undefined时,则称为有默认初始化值的参数。让我们修改上例,把last name的默认值设置为"Obama":
function buildName(firstName: string, lastName = "Obama") {
return firstName + " " + lastName;
}
let name1 = buildName("Barack");
// "Barack Obama"
let name2 = buildName("Barack", "Obama", "Sr.");
// [ts] Expected 2 arguments, but got 3.
let name3 = buildName("Barack", "Trump");
// "Barack Trump"
lastName 作为默认参数与可选参数一样,是可以省略的。不同的是,省略后会有一个默认值提供给函数使用:
function buildName(firstName: string, lastName?: string) {
// ...
}
function buildName(firstName: string, lastName = "Smith") {
// ...
}
还有一点不同,带默认值的参数不需要放在参数的最后面,它可以在任何位置。例如:
function buildName(firstName = "Barack", lastName: string) {
return firstName + " " + lastName;
}
let name1 = buildName("Barack");
// [ts] Expected 2 arguments, but got 1.
let name2 = buildName(undefined, "Obama");
// "Barack Obama"
let name3 = buildName("Donald", "Trump");
// "Donald Trump"
如果不是放在最后面,就必须使用 undefined 或 null 对该参数的位置进行占位处理。
3.剩余参数
有时,你想同时操作多个参数,或者你并不知道会有多少个参数传递进来。在JavaScript里,你可以使用arguments来访问所有传入的参数。而在TypeScript里,你可以把所有参数收集到一个变量中,加省略号即可:
function buildName(firstName: string, ...names: string[]) {
return firstName + " " + names.join(" ");
}
buildName("Barack", "Hussein", "Obama", "II");
可将剩余参数看成个数不限的可选参数:可以一个都没有,也可以有很多个。编译器创建一个参数数组用来存储这些剩余参数。
省略号也可以在函数类型定义上使用:
let buildNameFun: (firstName: string, ...names: string[]) => string;
- 点赞
- 收藏
- 关注作者
评论(0)