返回

入门理解 TS 泛型

后端

泛型简介

泛型是 TypeScript 中的一种特殊类型,可以表示任何类型的数据。泛型变量可以用来声明函数、类、接口等,并可以在这些类型的实例化时指定具体的类型参数。

泛型变量的定义方法是使用尖括号 <>,尖括号中是泛型的名称。例如,以下代码定义了一个名为 T 的泛型变量:

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

这个函数可以接收任何类型的数据作为参数,并返回相同类型的数据。例如,以下代码调用 identity 函数来返回一个字符串:

let s = identity<string>("hello");

集合

集合是 TypeScript 中的一种数据结构,可以存储多个元素。集合的类型可以通过泛型来指定。例如,以下代码定义了一个名为 List 的集合类型,它可以存储任何类型的数据:

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

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

  remove(x: T) {
    const index = this.data.indexOf(x);
    if (index !== -1) {
      this.data.splice(index, 1);
    }
  }

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

这个集合类提供了 addremoveget 等方法来操作集合中的数据。例如,以下代码创建了一个 List 实例并向其中添加了一些字符串:

let list = new List<string>();
list.add("hello");
list.add("world");

然后,我们可以使用 get 方法来获取集合中的数据:

let s = list.get(0); // "hello"

使用泛型来提高代码的可重用性和灵活性

泛型可以用来提高代码的可重用性和灵活性。例如,我们可以使用泛型来定义一个函数,该函数可以接收任何类型的数据作为参数,并返回相同类型的数据。这样,我们就可以使用这个函数来处理不同类型的数据,而无需编写多个不同的函数。

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

这个函数可以接收任何类型的数据作为参数,并返回相同类型的数据。例如,以下代码调用 identity 函数来返回一个字符串:

let s = identity<string>("hello");

泛型还可以用来定义一个集合类型,该集合类型可以存储任何类型的数据。这样,我们就可以使用这个集合类型来存储不同类型的数据,而无需编写多个不同的集合类型。

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

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

  remove(x: T) {
    const index = this.data.indexOf(x);
    if (index !== -1) {
      this.data.splice(index, 1);
    }
  }

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

这个集合类提供了 addremoveget 等方法来操作集合中的数据。例如,以下代码创建了一个 List 实例并向其中添加了一些字符串:

let list = new List<string>();
list.add("hello");
list.add("world");

然后,我们可以使用 get 方法来获取集合中的数据:

let s = list.get(0); // "hello"

总结

泛型是 TypeScript 中的一种特殊类型,可以表示任何类型的数据。泛型变量可以用来声明函数、类、接口等,并可以在这些类型的实例化时指定具体的类型参数。

泛型可以用来提高代码的可重用性和灵活性。例如,我们可以使用泛型来定义一个函数,该函数可以接收任何类型的数据作为参数,并返回相同类型的数据。这样,我们就可以使用这个函数来处理不同类型的数据,而无需编写多个不同的函数。

泛型还可以用来定义一个集合类型,该集合类型可以存储任何类型的数据。这样,我们就可以使用这个集合类型来存储不同类型的数据,而无需编写多个不同的集合类型。