入门理解 TS 泛型
2023-10-03 06:43:16
泛型简介
泛型是 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];
}
}
这个集合类提供了 add
、remove
和 get
等方法来操作集合中的数据。例如,以下代码创建了一个 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];
}
}
这个集合类提供了 add
、remove
和 get
等方法来操作集合中的数据。例如,以下代码创建了一个 List
实例并向其中添加了一些字符串:
let list = new List<string>();
list.add("hello");
list.add("world");
然后,我们可以使用 get
方法来获取集合中的数据:
let s = list.get(0); // "hello"
总结
泛型是 TypeScript 中的一种特殊类型,可以表示任何类型的数据。泛型变量可以用来声明函数、类、接口等,并可以在这些类型的实例化时指定具体的类型参数。
泛型可以用来提高代码的可重用性和灵活性。例如,我们可以使用泛型来定义一个函数,该函数可以接收任何类型的数据作为参数,并返回相同类型的数据。这样,我们就可以使用这个函数来处理不同类型的数据,而无需编写多个不同的函数。
泛型还可以用来定义一个集合类型,该集合类型可以存储任何类型的数据。这样,我们就可以使用这个集合类型来存储不同类型的数据,而无需编写多个不同的集合类型。