TypeScript 中范型的类型推断
2023-10-05 16:13:46
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;
}
}
在这个例子中,T
和 U
是类型参数。当我们创建一个 Pair
实例时,我们必须指定类型参数的值。例如,我们可以创建一个存储数字对的 Pair
:
const pair = new Pair<number, number>(1, 2);
TypeScript 会推断出 pair
的类型为 Pair<number, number>
。这意味着我们可以安全地访问 pair
的 first
和 second
属性,并知道它们将是数字。
泛型约束
有时,我们希望限制范型可以接受的类型。我们可以使用泛型约束来实现这一点。例如,我们创建一个 Swap
函数,它交换两个参数的值:
function swap<T extends number | string>(a: T, b: T): [T, T] {
return [b, a];
}
<T extends number | string>
部分是泛型约束。它指定 T
必须是 number
或 string
类型。这意味着我们只能调用 swap
函数来交换数字或字符串。
结论
TypeScript 中的范型是一种强大的工具,它允许我们创建可重用的、类型安全的代码。通过理解范型的类型推断和高级特性,我们可以编写更灵活、更健壮的代码。