TypeScript中的泛型是一种强大的工具,它允许您编写更灵活、可重用的代码。使用泛型,您可以编写适用于不同类型的函数和类,同时保持类型安全性。
下面是一些使用TypeScript泛型的实践记录和示例:
- 函数泛型:
typescriptCopy Code
function identity<T>(arg: T): T {
return arg;
}
let result = identity<string>("Hello");
console.log(result); // 输出:Hello
// 类型推断
let result2 = identity(10);
console.log(result2); // 输出:10
在上述示例中,identity 函数使用了泛型类型参数 T,它可以代表任意类型。这使得函数可以接受不同类型的参数,并将其返回,保持了灵活性。通过明确指定类型参数(如 identity<string>("Hello")),或者让编译器根据上下文进行类型推断(如 identity(10)),我们可以使用该函数来处理不同类型的值。
- 类泛型:
typescriptCopy Code
class ArrayWrapper<T> {
private array: T[];
constructor() {
this.array = [];
}
addItem(item: T) {
this.array.push(item);
}
getItems(): T[] {
return this.array;
}
}
let stringArray = new ArrayWrapper<string>();
stringArray.addItem("Apple");
stringArray.addItem("Banana");
let items = stringArray.getItems();
console.log(items); // 输出:["Apple", "Banana"]
在这个示例中,ArrayWrapper 类使用泛型类型参数 T 来创建一个可以存储任意类型的数组。我们可以通过使用不同的类型参数来创建多个实例,从而使得该类更加通用和灵活。在示例中,我们创建了一个 ArrayWrapper<string> 的实例并向其中添加了两个字符串,然后获取所有项并打印出来。
- 类型约束: 有时候,我们希望对泛型进行更严格的控制,以确保某些属性或方法在使用泛型类型时可用。这可以通过使用类型约束来实现。
typescriptCopy Code
interface Lengthwise {
length: number;
}
function logLength<T extends Lengthwise>(arg: T): void {
console.log(arg.length);
}
let obj = { length: 5, value: "Hello" };
logLength(obj); // 输出:5
在上述示例中,我们定义了一个接口 Lengthwise,它描述了具有 length 属性的对象。然后,我们使用类型约束 T extends Lengthwise 来指定传入的参数必须符合 Lengthwise 接口。这样,我们可以在函数中使用 arg.length 属性,并确保类型的安全性。
通过使用泛型和类型约束,您可以在TypeScript中编写更灵活和类型安全的代码。泛型允许您以一种通用的方式处理不同类型的数据,从而提高代码的可重用性。在编写TypeScript代码时,考虑使用泛型来增加代码的灵活性和安全性是一个很好的实践。