函数类型

为函数定义类型

平常用 javascript 定义一个函数:

  1. function add(x, y) {
  2. return x + y;
  3. }

下面用 TypeScript 给上面的函数定义类型:

  1. function add(x: number, y: number): number {
  2. return x + y;
  3. }

函数类型

前面已经介绍了如何给一个函数添加类型,下面就来介绍一下完整的函数类型

  1. let myAdd: (x: number, y: number) => number =
  2. function(x: number, y: number): number {
  3. return x + y;
  4. };

这里要注意一下 ES6 中的 => 和 TypeScript 中的 =>
在 TypeScript 的类型定义中, => 用来表示函数的定义,左边是输入类型,需要用括号括起来,右边是输出类型。
在 ES6 中, => 叫做箭头函数。

函数类型包含两部分:

  • 参数类型:为每一个参数指定一个名字和类型。
  • 返回值类型:返回值类型是函数类型的必要部分,如果函数没有返回任何值,则需要指定返回值类型为 void 而不能留空。

当写出完整函数类型的时候,这两部分都是需要的。

函数的参数

TypeScript 里的每个函数参数都是必须的。传递给一个函数的参数个数必须与函数期望的参数个数一致。

可选参数

在 TypeScript 里我们可以在参数名旁使用 ? 实现可选参数的功能。可选参数必须接在必需参数后面,也就是说,可选参数后面不允许再出现必需参数了。

  1. const add = (a: number, b?: number) => a + (b ? b : 0);

默认参数

TypeStript 会将添加了默认值的参数识别为可选参数,与普通可选参数不同的是,带默认值的参数不需要放在必须参数的后面。如果带默认值的参数出现在必须参数前面,用户必须明确的传入 undefined 值来获得默认值。

  1. const add = (a: number, b = 10) => a + b;

剩余参数

剩余参数与 JS 中的语法类似,需要用 ... 来表示剩余参数,而剩余参数则是一个由 number 组成的数组。剩余参数只能是最后一个参数。

  1. const add = (a: number, ...rest: number[]) => rest.reduce((a, b) => a + b, a);

函数重载

重载允许一个函数接受不同数量或类型的参数时,作出不同的处理。
重复定义多次函数,前几次是函数定义,最后一次是函数实现。TypeScript 会优先从最前面的函数定义开始匹配,所以多个函数定义如果有包含关系,需要优先把精确的定义写在前面,最后函数实现时,需要使用 | 操作符或者 ? 操作符,把所有可能的输入类型全都包含进去,以具体实现。

  1. interface Direction {
  2. top: number;
  3. right: number;
  4. bottom: number;
  5. left: number;
  6. }
  7. function assigned(all: number): Direction;
  8. function assigned(topAndBottom: number, leftAndRight: number): Direction;
  9. function assigned(top: number, right: number, bottom: number, left: number): Direction;
  10. function assigned(a: number, b?: number, c?: number, d?: number) {
  11. if (b === undefined && c === undefined && d === undefined) {
  12. b = c = d = a;
  13. } else if (c === undefined && d === undefined) {
  14. c = a;
  15. d = b;
  16. }
  17. return {
  18. top: a,
  19. right: b,
  20. bottom: c,
  21. left: d
  22. };
  23. }
  24. assigned(1);
  25. assigned(1, 2);
  26. assigned(1, 2, 3); //Error
  27. assigned(1, 2, 3, 4);