5. TS函数
函数的类型声明,需要在声明函数时,给出参数的类型和返回值的类型。如果没有返回值,可以标注为void
返回值的类型通常可以不写,因为 TypeScript 自己会推断出来。
// 标准写法
function hello(txt:string) {
console.log('hello ' + txt);
}
如果变量被赋值为一个函数,变量的类型有两种写法。
// 写法一:依靠类型推断得出变量hello的类型
const hello = function (txt:string) {
console.log('hello ' + txt);
}
// 写法二: 显式声明hello的类型
const hello:
(txt:string) => void
= function (txt) {
console.log('hello ' + txt);
};
如果函数的某个参数可以省略,则在参数名后面加问号表示。
设置了默认值的参数,就是可选的。如果不传入该参数,它就会等于默认值。
可选参数与默认值不能同时使用。
参数解构 :
type ABC = { a:number; b:number; c:number };
function sum({ a, b, c }:ABC) {
console.log(a + b + c);
}
rest 参数:
rest 参数表示函数剩余的所有参数
// rest 参数nums为数组
function joinNumbers(x: string, ...nums:number[]) {
// ...
}
参数也可再类型前加readonly,这样函数中就不能修改这个参数。
注意,readonly关键字目前只允许用在数组和元组类型的参数前面,如果用在其他类型的参数前面,就会报错。
函数重载:
有些函数可以接受不同类型或不同个数的参数,并且根据参数的不同,会有不同的函数行为。这种根据参数类型不同,执行不同逻辑的行为,称为函数重载(function overload)。
TypeScript 对于“函数重载”的类型声明方法是,逐一定义每一种情况的类型。
function reverse(str:string):string;
function reverse(arr:any[]):any[];
function reverse(
stringOrArray:string|any[]
):string|any[] {
if (typeof stringOrArray === 'string')
return stringOrArray.split('').reverse().join('');
else
return stringOrArray.slice().reverse();
}
前两行类型声明列举了重载的各种情况。第三行是函数本身的类型声明,它必须与前面已有的重载声明兼容。
注意,重载的各个类型描述与函数的具体实现之间,不能有其他代码,否则报错。函数重载的每个类型声明之间,以及类型声明与函数实现的类型之间,不能有冲突。
由于重载是一种比较复杂的类型声明方法,为了降低复杂性,一般来说,如果可以的话,应该优先使用联合类型替代函数重载,除非多个参数之间、或者某个参数与返回值之间,存在对应关系。
// 写法一
function len(s:string):number;
function len(arr:any[]):number;
function len(x:any):number {
return x.length;
}
// 写法二
function len(x:any[]|string):number {
return x.length;
}
评论