Skip to content

函数签名

函数签名(Function Signature)是 TypeScript 中用来描述函数类型的一种方式。它定义了函数的参数列表以及返回值类型,确保在调用函数时传入正确的参数类型,并且函数会按照预期返回特定类型的值。函数签名对于实现类型安全非常重要。

函数签名的基本结构

一个完整的函数签名由两部分组成:

  1. 参数列表:包括每个参数的名称和类型。
  2. 返回值类型:指定函数执行后返回的值的类型。

简单的函数签名示例

typescript
function add(x: number, y: number): number {
  return x + y;
}

在这个例子中,add 函数有两个 number 类型的参数 xy,并且返回一个 number 类型的值。

匿名函数表达式和箭头函数的函数签名

除了函数声明外,匿名函数表达式和箭头函数也可以有明确的函数签名:

typescript
let multiply = function (a: number, b: number): number {
  return a * b;
};

// 或者使用箭头函数
const divide = (a: number, b: number): number => a / b;

函数签名的多种表示方法

使用类型别名定义函数类型

你可以通过类型别名来创建可重用的函数类型:

typescript
type MathOperation = (a: number, b: number) => number;
// 或,function 关键字可省略
type MathOperation = function(a: number, b: number): number;

let add: MathOperation = (x, y) => x + y;
let subtract: MathOperation = (x, y) => x - y;

接口中的函数签名

接口可以包含函数签名,以定义对象的方法或作为回调函数的类型:

typescript
interface SearchFunc {
  (source: string, subString: string): boolean;
}

interface SearchFunc {
  reset(source: string, subString: string): boolean;
}

let mySearch: SearchFunc;
mySearch = function (source: string, subString: string) {
  return source.search(subString) !== -1;
};

可选参数、默认参数和剩余参数

  • 可选参数:可以在参数后面加上 ? 来标记该参数为可选。

    typescript
    function buildName(firstName: string, lastName?: string): string {
      return lastName ? `${firstName} ${lastName}` : firstName;
    }
  • 默认参数:可以为参数提供默认值,如果调用时没有提供该参数,则使用默认值。

    typescript
    function buildName(firstName: string, lastName: string = "Smith"): string {
      return `${firstName} ${lastName}`;
    }
  • 剩余参数:使用 ... 操作符收集不定数量的参数为一个数组。

    typescript
    function push(array: any[], ...items: any[]): void {
      items.forEach((item) => array.push(item));
    }
    
    let arr = [];
    push(arr, 1, 2, 3);
    console.log(arr); // 输出: [1, 2, 3]

函数重载

有时你可能想要为同一个函数提供多个不同的签名。这被称为函数重载,允许你根据传入的不同参数类型或数量提供不同的实现逻辑。

typescript
function makeDate(timestamp: number): Date;
function makeDate(m: number, d: number, y: number): Date;
function makeDate(mOrTimestamp: number, d?: number, y?: number): Date {
  if (d !== undefined && y !== undefined) {
    return new Date(y, mOrTimestamp, d);
  } else {
    return new Date(mOrTimestamp);
  }
}

// 使用重载:
const d1 = makeDate(12345678); // 使用 timestamp 参数
const d2 = makeDate(5, 5, 2020); // 使用 m, d, y 参数

总结

函数签名为 TypeScript 提供了一种强大而灵活的方式来定义函数的行为,确保代码的类型安全性和可读性。通过理解如何定义和使用这些签名,你可以编写出更加健壮和易于维护的代码。

Released under the MIT License.