TypeScript 泛型类
泛型类是TypeScript中一个强大的特性,它允许我们创建可以处理多种数据类型的类。通过使用泛型类,我们可以编写更加灵活和可重用的代码,而不必为每种数据类型编写单独的类。
什么是泛型类?
泛型类是一种可以接受类型参数的类。这些类型参数在类实例化时被指定,从而使得类中的属性和方法可以处理不同类型的数据。泛型类的主要优势在于它们提供了类型安全性,同时减少了代码重复。
基本语法
泛型类的基本语法如下:
class ClassName<T> {
// 类成员
}
其中,T
是类型参数,可以在类中的任何地方使用。当我们实例化类时,可以指定 T
的具体类型。
示例:简单的泛型类
让我们通过一个简单的例子来理解泛型类的使用。假设我们有一个 Box
类,它可以存储任何类型的值。
class Box<T> {
private value: T;
constructor(value: T) {
this.value = value;
}
getValue(): T {
return this.value;
}
}
// 使用泛型类
const numberBox = new Box<number>(42);
console.log(numberBox.getValue()); // 输出: 42
const stringBox = new Box<string>("Hello");
console.log(stringBox.getValue()); // 输出: Hello
在这个例子中,Box
类可以存储任何类型的值。我们通过指定类型参数 T
来定义 Box
类,并在实例化时指定具体的类型。
泛型类的实际应用
泛型类在实际开发中有很多应用场景。例如,我们可以使用泛型类来实现一个通用的数据存储类,或者一个通用的工具类。
示例:通用的数据存储类
假设我们需要一个通用的数据存储类,可以存储不同类型的数据,并提供添加和获取数据的方法。
class DataStore<T> {
private data: T[] = [];
addItem(item: T): void {
this.data.push(item);
}
getItem(index: number): T {
return this.data[index];
}
getAllItems(): T[] {
return this.data;
}
}
// 使用泛型类
const numberStore = new DataStore<number>();
numberStore.addItem(1);
numberStore.addItem(2);
console.log(numberStore.getAllItems()); // 输出: [1, 2]
const stringStore = new DataStore<string>();
stringStore.addItem("Apple");
stringStore.addItem("Banana");
console.log(stringStore.getAllItems()); // 输出: ["Apple", "Banana"]
在这个例子中,DataStore
类可以存储任何类型的数据,并且我们可以在实例化时指定具体的类型。
泛型类的约束
有时我们希望泛型类只能接受特定类型的参数。这时,我们可以使用泛型约束来实现。
示例:带有约束的泛型类
假设我们希望 DataStore
类只能存储具有 id
属性的对象。
interface Identifiable {
id: number;
}
class DataStore<T extends Identifiable> {
private data: T[] = [];
addItem(item: T): void {
this.data.push(item);
}
getItemById(id: number): T | undefined {
return this.data.find(item => item.id === id);
}
}
// 使用带有约束的泛型类
const userStore = new DataStore<{ id: number; name: string }>();
userStore.addItem({ id: 1, name: "Alice" });
userStore.addItem({ id: 2, name: "Bob" });
console.log(userStore.getItemById(1)); // 输出: { id: 1, name: "Alice" }
在这个例子中,DataStore
类只能存储具有 id
属性的对象,这通过 T extends Identifiable
来实现。
总结
泛型类是TypeScript中一个非常有用的特性,它允许我们创建可以处理多种数据类型的类。通过使用泛型类,我们可以编写更加灵活和可重用的代码,同时保持类型安全性。
在实际开发中,泛型类可以用于实现通用的数据存储类、工具类等。我们还可以通过泛型约束来限制泛型类可以接受的类型参数。
附加资源
练习
- 创建一个泛型类
Pair
,它可以存储两个值,并且这两个值可以是不同的类型。 - 修改
DataStore
类,使其支持删除指定id
的项。 - 创建一个泛型类
Stack
,实现栈的基本操作(push、pop、peek)。
通过完成这些练习,你将更好地理解泛型类的使用和优势。