返回

TypeScript 中范型的类型推断

前端

TypeScript 中的范型是一种强大的工具,它允许我们创建可重用的代码,而不必牺牲类型安全性。通过使用范型,我们可以定义一个函数或类,它可以处理任何类型的数据,同时仍然保持对传入类型的信息。

范型的计算

TypeScript 范型的类型推断是基于结构类型系统。这意味着范型的类型是由它的使用方式决定的。例如,如果我们有一个函数 logger,它接受一个参数并打印该参数:

function logger(value: any) {
  console.log(value);
}

当我们调用 logger 并传入一个数字时,TypeScript 会推断出 value 的类型为 number。这是因为我们使用 console.log 打印了一个数字。

同样地,如果我们调用 logger 并传入一个字符串,TypeScript 会推断出 value 的类型为 string

logger("Hello, world!");

高级范型

TypeScript 中的范型可以变得更加复杂。我们可以使用类型参数来定义范型的行为。例如,我们创建一个 Pair 类,它存储一对值:

class Pair<T, U> {
  constructor(private first: T, private second: U) {}

  getFirst(): T {
    return this.first;
  }

  getSecond(): U {
    return this.second;
  }
}

在这个例子中,TU 是类型参数。当我们创建一个 Pair 实例时,我们必须指定类型参数的值。例如,我们可以创建一个存储数字对的 Pair

const pair = new Pair<number, number>(1, 2);

TypeScript 会推断出 pair 的类型为 Pair<number, number>。这意味着我们可以安全地访问 pairfirstsecond 属性,并知道它们将是数字。

泛型约束

有时,我们希望限制范型可以接受的类型。我们可以使用泛型约束来实现这一点。例如,我们创建一个 Swap 函数,它交换两个参数的值:

function swap<T extends number | string>(a: T, b: T): [T, T] {
  return [b, a];
}

<T extends number | string> 部分是泛型约束。它指定 T 必须是 numberstring 类型。这意味着我们只能调用 swap 函数来交换数字或字符串。

结论

TypeScript 中的范型是一种强大的工具,它允许我们创建可重用的、类型安全的代码。通过理解范型的类型推断和高级特性,我们可以编写更灵活、更健壮的代码。