在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') ;//可选参数,lastNamelet tomName = buildName('tom') ;
需要注意的是:可选参数必须在必须参数后面。
//参数默认值function buildNewName(firstname: string, lastname: string = 'Cat'): string {return firstname + ' ' + lastname;}//完整调用let newTom = buildNewName('tom', 'cat');//使用默认参数let tomNewName = buildNewName('tom');//必须参数传undefinedlet 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会优先从最前面的函数定义开始匹配,所以多个函数如果有包含关系,需要优先将精确的定义写在前面。
