TypeScript - 泛型
在 TypeScript 中,泛型是一种允许创建可重用组件(如函数、类、接口等)的概念。它允许开发者创建可以处理多种数据类型的函数、类等,而不仅仅是一种数据类型。简而言之,它允许开发者编写可以处理多种数据类型的程序,并且这些程序具有长期的可扩展性。
提示
泛型就像占位符,可以在使用泛型代码时填充具体的类型。
为什么需要泛型?
在深入了解 TypeScript 泛型之前,让我们先理解一些需要使用泛型的问题场景。
示例 1:打印变量值
假设你想要打印作为参数传递的变量的值。
function printVar(val: number) {
console.log(val);
}
printVar(10);
输出结果:
10
如果你想扩展 printVar() 函数的用途,使其能够打印其他类型变量的值,比如字符串、布尔值等,一种方法是像下面的例子一样。
示例 2:联合类型参数
function printVar(val: number | string | boolean) {
console.log(val);
}
printVar(true);
输出结果:
true
如果你想打印数组或对象的值呢?你需要扩展 val 参数的类型,这会让代码变得难以阅读。
另一种方法是使用 any 类型的参数,如下例所示。
示例 3:any 类型参数
function printVar(val: any) {
console.log(val);
}
printVar("Hello world!");
输出结果:
Hello world!
上面代码的问题在于,函数内部无法知道变量的具体类型。无论你传递的是字符串、数字、布尔值、数组等,函数中的变量类型都是 any。
这时,泛型函数就派上用场了。
泛型语法
你可以使用以下语法在 TypeScript 中使用泛型变量与函数。
function printVar<T>(val: T) {
// 函数体
}
printVar(val);
- 开发者可以在函数名后的尖括号(
<>)中使用类型变量。 - 之后,你可以在参数中使用类型变量
T作为参数的类型。 - 这里,开发者可以用任何有效的标识符代替
T。 - 之后,你可以用任何数据类型的值调用该函数,函数会自动捕获变量的数据类型。