函数类型
为函数定义类型
平常用 javascript 定义一个函数:
function add(x, y) {return x + y;}
下面用 TypeScript 给上面的函数定义类型:
function add(x: number, y: number): number {return x + y;}
函数类型
前面已经介绍了如何给一个函数添加类型,下面就来介绍一下完整的函数类型
let myAdd: (x: number, y: number) => number =function(x: number, y: number): number {return x + y;};
这里要注意一下 ES6 中的 => 和 TypeScript 中的 =>。
在 TypeScript 的类型定义中, => 用来表示函数的定义,左边是输入类型,需要用括号括起来,右边是输出类型。
在 ES6 中, => 叫做箭头函数。
函数类型包含两部分:
- 参数类型:为每一个参数指定一个名字和类型。
- 返回值类型:返回值类型是函数类型的必要部分,如果函数没有返回任何值,则需要指定返回值类型为
void而不能留空。
当写出完整函数类型的时候,这两部分都是需要的。
函数的参数
TypeScript 里的每个函数参数都是必须的。传递给一个函数的参数个数必须与函数期望的参数个数一致。
可选参数
在 TypeScript 里我们可以在参数名旁使用 ? 实现可选参数的功能。可选参数必须接在必需参数后面,也就是说,可选参数后面不允许再出现必需参数了。
const add = (a: number, b?: number) => a + (b ? b : 0);
默认参数
TypeStript 会将添加了默认值的参数识别为可选参数,与普通可选参数不同的是,带默认值的参数不需要放在必须参数的后面。如果带默认值的参数出现在必须参数前面,用户必须明确的传入 undefined 值来获得默认值。
const add = (a: number, b = 10) => a + b;
剩余参数
剩余参数与 JS 中的语法类似,需要用 ... 来表示剩余参数,而剩余参数则是一个由 number 组成的数组。剩余参数只能是最后一个参数。
const add = (a: number, ...rest: number[]) => rest.reduce((a, b) => a + b, a);
函数重载
重载允许一个函数接受不同数量或类型的参数时,作出不同的处理。
重复定义多次函数,前几次是函数定义,最后一次是函数实现。TypeScript 会优先从最前面的函数定义开始匹配,所以多个函数定义如果有包含关系,需要优先把精确的定义写在前面,最后函数实现时,需要使用 | 操作符或者 ? 操作符,把所有可能的输入类型全都包含进去,以具体实现。
interface Direction {top: number;right: number;bottom: number;left: number;}function assigned(all: number): Direction;function assigned(topAndBottom: number, leftAndRight: number): Direction;function assigned(top: number, right: number, bottom: number, left: number): Direction;function assigned(a: number, b?: number, c?: number, d?: number) {if (b === undefined && c === undefined && d === undefined) {b = c = d = a;} else if (c === undefined && d === undefined) {c = a;d = b;}return {top: a,right: b,bottom: c,left: d};}assigned(1);assigned(1, 2);assigned(1, 2, 3); //Errorassigned(1, 2, 3, 4);
