返回

TypeScript 入门宝典:深入浅出掌握泛型

前端

泛型初探

泛型本质上是一种参数化类型,它允许你在创建函数、类或接口时使用类型变量。这种灵活性使得代码更加简洁、可重用性更高,并能确保类型安全。

类型变量

类型变量就像是占位符,它们在代码中用尖括号 <> 表示。在使用泛型时,你可以为类型变量指定一个名称,例如 T、K、V 等。当使用泛型函数或类时,你可以在调用或实例化时传入具体的数据类型来替换类型变量。

泛型函数

泛型函数允许你创建可重用的函数,而无需为每种数据类型编写单独的函数。以下是一个简单的泛型函数示例:

function identity<T>(value: T): T {
  return value;
}

这个函数接收一个类型为 T 的参数,并返回相同类型的值。你可以用任何数据类型调用这个函数,例如:

const num = identity(10); // num 的类型为 number
const str = identity("Hello"); // str 的类型为 string

泛型类

泛型类允许你创建可重用的类,而无需为每种数据类型编写单独的类。以下是一个简单的泛型类示例:

class Stack<T> {
  private data: T[] = [];

  push(item: T) {
    this.data.push(item);
  }

  pop(): T | undefined {
    return this.data.pop();
  }
}

这个类实现了栈的数据结构,它可以存储任何类型的数据。你可以用任何数据类型实例化这个类,例如:

const numStack = new Stack<number>();
const strStack = new Stack<string>();

泛型约束

有时,你可能需要对泛型类型施加约束,以确保它们满足某些条件。你可以使用 extends 来指定类型变量的约束。例如,以下泛型函数要求其参数必须是 Comparable 接口的实现:

interface Comparable<T> {
  compareTo(other: T): number;
}

function max<T extends Comparable<T>>(a: T, b: T): T {
  if (a.compareTo(b) > 0) {
    return a;
  } else {
    return b;
  }
}

泛型的优势

泛型为 TypeScript 带来了许多优势,包括:

  • 代码重用:泛型允许你创建可重用的组件,而无需为每种数据类型编写单独的代码。
  • 类型安全:泛型有助于确保类型安全,防止类型不匹配导致的错误。
  • 代码可读性:泛型可以使你的代码更具可读性和可维护性,尤其是在处理复杂的数据结构时。

结语

泛型是 TypeScript 中一项强大的特性,它可以极大地提高代码的可重用性、类型安全性和可读性。通过本指南,你已经对泛型有了基本的了解,可以开始在自己的项目中使用它。