TypeScript 泛型
TypeScript 的泛型(Generics)是一种强大的特性,它允许我们在定义函数、接口或类的时候,不预先指定具体的类型,而是在使用的时候再指定类型。这种特性提高了代码的复用性,同时保持了类型安全和灵活性。
泛型基础
泛型可以用在函数、接口和类中。下面是一个简单的泛型函数示例:
function identity<T>(arg: T): T {
return arg;
}
在这个例子中,T 代表一个类型变量,它可以在调用函数时被指定为任何类型。例如:
let output = identity<string>("myString"); // output 类型为 'string'
let outputNumber = identity<number>(100); // outputNumber 类型为 'number'
泛型接口
泛型也可以用于接口,使得接口可以支持多种类型,同时保持接口的结构和类型检查。例如:
interface GenericIdentityFn<T> {
(arg: T): T;
}
function identity<T>(arg: T): T {
return arg;
}
let myIdentity: GenericIdentityFn<number> = identity;
在这个例子中,GenericIdentityFn 是一个泛型接口,它定义了一个函数类型,这个函数接受一个类型为 T 的参数,并返回一个类型为 T 的值。
泛型类
泛型类与泛型接口类似,可以在类名后面添加类型变量。例如:
class GenericNumber<T> {
zeroValue: T;
add: (x: T, y: T) => T;
constructor(zeroValue: T, add: (x: T, y: T) => T) {
this.zeroValue = zeroValue;
this.add = add;
}
}
let myGenericNumber = new GenericNumber<number>(0, (x, y) => x + y);
在这个例子中,GenericNumber 是一个泛型类,它有一个属性 zeroValue 和一个方法 add,它们都使用了类型变量 T。
泛型约束
有时候,我们可能希望限制泛型类型的范围,这时可以使用泛型约束。例如,我们希望泛型 T 必须有 length 属性,可以这样定义:
interface Lengthwise {
length: number;
}
function loggingIdentity<T extends Lengthwise>(arg: T): T {
console.log(arg.length); // Now we know it has a .length property, so no more error
return arg;
}
在这个例子中,T 被约束为必须实现 Lengthwise 接口,这意味着它必须有一个 length 属性。
总结
TypeScript 的泛型提供了强大的类型抽象能力,使得开发者可以编写更加灵活和可重用的代码。通过泛型,我们可以创建适用于多种类型的数据结构和方法,同时保持类型安全和清晰的代码结构。
585

被折叠的 条评论
为什么被折叠?



