TypeScript 泛型
泛型是TypeScript中一个强大的特性 ,它允许我们编写灵活且可重用的代码。通过泛型,我们可以创建适用于多种类型的函数、类和接口,而不必为每种类型编写重复的代码。
什么是泛型?
泛型(Generics)是一种在定义函数、接口或类时不预先指定具体类型,而在使用时再指定类型的机制。泛型的主要目的是提高代码的复用性和灵活性。
泛型的基本语法
在TypeScript中,泛型通常使用尖括号 <T>
来表示,其中 T
是一个类型变量。我们可以将 T
替换为任何类型。
function identity<T>(arg: T): T {
return arg;
}
在这个例子中,identity
函数接受一个类型为 T
的参数,并返回相同类型的值。T
是一个占位符类型,它可以是任何类型。
使用泛型
我们可以通过以下方式调用 identity
函数:
let output1 = identity<string>("Hello");
let output2 = identity<number>(42);
在这个例子中,output1
的类型是 string
,而 output2
的类型是 number
。泛型允许我们在调用函数时指定类型。
泛型约束
有时候,我们希望泛型类型具有某些特定的属性或方法。这时,我们可以使用泛型约束来限制类型。
interface Lengthwise {
length: number;
}
function loggingIdentity<T extends Lengthwise>(arg: T): T {
console.log(arg.length);
return arg;
}
在这个例子中,loggingIdentity
函数要求传入的参数必须具有 length
属性。这样,我们就可以在函数内部安全地访问 arg.length
。
泛型类和接口
泛型不仅可以用于函数,还可以用于类和接口。
泛型类
class GenericNumber<T> {
zeroValue: T;
add: (x: T, y: T) => T;
}
let myGenericNumber = new GenericNumber<number>();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = function(x, y) { return x + y; };
在这个例子中,GenericNumber
类使用泛型 T
来定义 zeroValue
和 add
方法。我们可以通过指定类型参数来创建不同类型的 GenericNumber
实例。