跳到主要内容

TypeScript 泛型类

泛型类是TypeScript中一个强大的特性,它允许我们创建可以处理多种数据类型的类。通过使用泛型类,我们可以编写更加灵活和可重用的代码,而不必为每种数据类型编写单独的类。

什么是泛型类?

泛型类是一种可以接受类型参数的类。这些类型参数在类实例化时被指定,从而使得类中的属性和方法可以处理不同类型的数据。泛型类的主要优势在于它们提供了类型安全性,同时减少了代码重复。

基本语法

泛型类的基本语法如下:

typescript
class ClassName<T> {
// 类成员
}

其中,T 是类型参数,可以在类中的任何地方使用。当我们实例化类时,可以指定 T 的具体类型。

示例:简单的泛型类

让我们通过一个简单的例子来理解泛型类的使用。假设我们有一个 Box 类,它可以存储任何类型的值。

typescript
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 类,并在实例化时指定具体的类型。

泛型类的实际应用

泛型类在实际开发中有很多应用场景。例如,我们可以使用泛型类来实现一个通用的数据存储类,或者一个通用的工具类。

示例:通用的数据存储类

假设我们需要一个通用的数据存储类,可以存储不同类型的数据,并提供添加和获取数据的方法。

typescript
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 属性的对象。

typescript
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中一个非常有用的特性,它允许我们创建可以处理多种数据类型的类。通过使用泛型类,我们可以编写更加灵活和可重用的代码,同时保持类型安全性。

在实际开发中,泛型类可以用于实现通用的数据存储类、工具类等。我们还可以通过泛型约束来限制泛型类可以接受的类型参数。

附加资源

练习

  1. 创建一个泛型类 Pair,它可以存储两个值,并且这两个值可以是不同的类型。
  2. 修改 DataStore 类,使其支持删除指定 id 的项。
  3. 创建一个泛型类 Stack,实现栈的基本操作(push、pop、peek)。

通过完成这些练习,你将更好地理解泛型类的使用和优势。