函数声明

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

函数表达式

在 TypeScript 的类型定义中,=> 用来表示函数的定义,左边是输入类型,需要用括号括起来,右边是输出类型。

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

接口定义

  1. interface SearchFunc {
  2. (source: string, subString: string): boolean;
  3. }
  4. let mySearch: SearchFunc;
  5. mySearch = function(source: string, subString: string) {
  6. return source.search(subString) !== -1;
  7. }

可选参数

与定义接口一样,可以使用?表示可选的参数,可选参数后面不可以再出现必须参数

  1. function buildName(firstName: string, lastName?: string) {
  2. if (lastName) {
  3. return firstName + ' ' + lastName;
  4. } else {
  5. return firstName;
  6. }
  7. }
  8. let tomcat = buildName('Tom', 'Cat');
  9. let tom = buildName('Tom');

参数默认值

在 ES6 中,我们允许给函数的参数添加默认值,TypeScript 会将添加了默认值的参数识别为可选参数,此时就不受「可选参数必须接在必需参数后面」的限制了

  1. function buildName(firstName: string = 'Tom', lastName: string) {
  2. return firstName + ' ' + lastName;
  3. }
  4. let tomcat = buildName('Tom', 'Cat');
  5. let cat = buildName(undefined, 'Cat')

剩余参数

reset参数只能是函数的最后一个参数

  1. function push(array: any[], ...items: any[]) {
  2. items.forEach(function(item) {
  3. array.push(item);
  4. });
  5. }
  6. let a = [];
  7. push(a, 1, 2, 3);

重载

可以使用重载定义多个函数类型,在编辑器的代码提示中,可以正确的看到这些类型提示
注意:TypeScript 会优先从最前面的函数定义开始匹配,所以多个函数定义如果有包含关系,需要优先把精确的定义写在前面

  1. function reverse(x: number): number;
  2. function reverse(x: string): string;
  3. function reverse(x: number | string): number | string | void {
  4. if (typeof x === 'number') {
  5. return Number(x.toString().split('').reverse().join(''));
  6. } else if (typeof x === 'string') {
  7. return x.split('').reverse().join('');
  8. }
  9. }