函数类型
为函数定义类型
平常用 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); //Error
assigned(1, 2, 3, 4);