在TypeScript
中,有两种常见的定义函数方式——函数声明(Function Declaration
)和函数表达式(Function Expression
)
// 函数声明
function sum(x: number, y: number): number {
return x + y;
}
//表达式声明
let mySum = function (x: number, y: number): number {
return x + y;
}
在调用过程中,输入多余的(或小于要求的)参数,都是不被允许的
// 函数声明
function sum(x: number, y: number): number {
return x + y;
}
//函数调用,多输入一个参数
sum(1, 2, 3);
//编译出错
- error TS2554: Expected 2 arguments, but got 3.
//函数调用,少输入一个参数
sum(1);
//编译出错
- error TS2554: Expected 2 arguments, but got 1.
用接口定义函数的形状
interface ISearchFunc {
//函数声明
(source: string, substring: string): boolean;
}
let mySearch: ISearchFunc;
//函数实现
mySearch = function (source: string, substring: string): boolean {
return source.search(substring) !== -1;
}
可选参数:在函数调用的过程中,为了方便,可用可选参数来实现传入参数个数减少。
//可选参数
function buildName(firstName: string, lastName?: string): string {
if(lastName){
return firstName + lastName ;
}else{
return firstName ;
}
}
let tomcat = buildName('tom' , 'cat') ;
//可选参数,lastName
let tomName = buildName('tom') ;
需要注意的是:可选参数必须在必须参数后面。
//参数默认值
function buildNewName(firstname: string, lastname: string = 'Cat'): string {
return firstname + ' ' + lastname;
}
//完整调用
let newTom = buildNewName('tom', 'cat');
//使用默认参数
let tomNewName = buildNewName('tom');
//必须参数传undefined
let tomNaN = buildNewName(undefined, 'cat');
如果存在默认参数,此时就不受【可选参数必须在必需参数后面
】的限制了
剩余参数:可使用...rest
方式设置函数的剩余参数
// 函数 ...rest 参数
function push(array: any , ... items:any[]){
items.forEach(function(item){
array.push(item) ;
})
}
注意:rest参数只能是最后一个参数。
函数重载:允许一个函数接收不同数量或类型的参数时,做出不同的处理。
function reverse(x: number): number;
function reverse(x: string): string;
function reverse(x: number | string): number | string | void {
if (typeof x === 'number') {
return Number(x.toString().split('').reverse().join(''));
} else if (typeof x === 'string') {
return x.split('').reverse().join('');
}
}
在上述示例中,TypeScript
会优先从最前面的函数定义开始匹配,所以多个函数如果有包含关系,需要优先将精确的定义写在前面。