返回

让我们一探究竟 TypeScript 中的泛型

前端

泛型是什么?

泛型是 TypeScript 中的一种类型变量,它允许你在不指定具体类型的情况下定义函数、类和接口。这意味着你可以编写代码,这些代码可以与任何类型一起工作,而无需你为每种类型编写单独的代码。

泛型函数

泛型函数可以接受任何类型的参数,并返回任何类型的返回值。要定义泛型函数,你需要在函数名前面使用类型变量。例如,下面的函数可以接受任何类型的参数,并返回该参数的类型:

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

泛型类

泛型类可以接受任何类型的参数,并创建该类型的实例。要定义泛型类,你需要在类名前面使用类型变量。例如,下面的类可以接受任何类型的参数,并创建该类型的数组:

class Array<T> {
  private data: T[];

  constructor(data: T[]) {
    this.data = data;
  }

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

  get(index: number): T {
    return this.data[index];
  }
}

泛型接口

泛型接口可以定义任何类型的成员。要定义泛型接口,你需要在接口名前面使用类型变量。例如,下面的接口定义了一个具有 nameage 属性的对象:

interface Person<T> {
  name: string;
  age: T;
}

泛型约束

泛型约束可以限制类型变量的类型。例如,下面的函数只能接受数字参数:

function sum<T extends number>(x: T, y: T): T {
  return x + y;
}

类型推断

TypeScript 可以自动推断泛型类型。这意味着你通常不必显式指定类型变量的类型。例如,下面的函数可以接受任何类型的参数,并返回该参数的类型:

function identity(x) {
  return x;
}

泛型编程

泛型编程是一种使用泛型来编写代码的编程范式。泛型编程可以使你的代码更灵活、更健壮。例如,下面的代码使用泛型编程来实现一个排序算法:

function sort<T>(array: T[], compareFn: (a: T, b: T) => number): T[] {
  for (let i = 0; i < array.length; i++) {
    for (let j = i + 1; j < array.length; j++) {
      if (compareFn(array[i], array[j]) > 0) {
        const temp = array[i];
        array[i] = array[j];
        array[j] = temp;
      }
    }
  }

  return array;
}

泛型在 TypeScript 中的应用

泛型在 TypeScript 中有很多应用。以下是一些常见的示例:

  • 集合:泛型可以用于创建集合,例如数组、链表和栈。
  • 算法:泛型可以用于实现算法,例如排序、搜索和二分查找。
  • 函数:泛型可以用于编写函数,这些函数可以接受任何类型的参数,并返回任何类型的返回值。
  • 类:泛型可以用于创建类,这些类可以接受任何类型的参数,并创建该类型的实例。
  • 接口:泛型可以用于定义接口,这些接口可以定义任何类型的成员。

结论

泛型是 TypeScript 中一个非常强大的特性。它可以让你编写更灵活、更健壮的代码。如果你想成为一名优秀的 TypeScript 开发者,那么你必须掌握泛型。

附加信息