📅  最后修改于: 2023-12-03 15:20:43.630000             🧑  作者: Mango
泛型是在编程中用于增强代码重用性和类型安全的强大工具。它允许我们编写可以用于多种类型的代码,而不仅仅限制于一种具体类型。泛型可以应用于函数、类、接口等各种代码结构。在TypeScript中,泛型通过使用类型参数来实现。
泛型函数是一种能够接受不同类型参数的函数。使用泛型函数可以编写更通用的代码,并且提供更好的类型检查。下面是一个使用泛型函数的示例:
function reverse<T>(arr: T[]): T[] {
return arr.reverse();
}
// 使用泛型函数
const numbers = [1, 2, 3, 4, 5];
const reversedNumbers = reverse<number>(numbers); // 返回类型为number[]
在上面的示例中,reverse
函数接受一个数组参数arr
,并返回一个反转后的数组。<T>
表示泛型类型参数,告诉编译器我们希望在调用该函数时动态确定类型。在使用泛型函数时,我们可以通过<number>
语法来指定泛型类型为number
。
泛型类是一种能够接受不同类型参数的类。使用泛型类可以编写更通用的类定义,使其可以适用于多种类型。下面是一个使用泛型类的示例:
class Container<T> {
private value: T;
constructor(value: T) {
this.value = value;
}
getValue(): T {
return this.value;
}
}
// 使用泛型类
const container = new Container<number>(5); // 创建一个存储number类型值的容器
const value = container.getValue(); // 返回类型为number
在上面的示例中,Container
类接受一个类型参数T
,并具有一个泛型属性value
以及一个返回泛型类型的方法getValue
。在使用泛型类时,我们通过<number>
语法来指定泛型类型为number
。
泛型接口是一种能够接受不同类型参数的接口。使用泛型接口可以定义更通用的接口规范。下面是一个使用泛型接口的示例:
interface Pair<T, U> {
first: T;
second: U;
}
// 使用泛型接口
const pair: Pair<number, string> = {
first: 10,
second: "hello",
};
在上面的示例中,Pair
接口接受两个类型参数T
和U
,并定义了两个属性first
和second
,分别对应不同的类型参数。在使用泛型接口时,我们通过<number, string>
语法来指定泛型类型为number
和string
。
泛型约束允许我们对泛型类型进行限制,以确保满足某些特定条件。通过使用泛型约束,我们可以对泛型类型进行更精确的类型推断和操作。下面是一个使用泛型约束的示例:
interface Printable {
print(): void;
}
function printItem<T extends Printable>(item: T) {
item.print();
}
// 使用泛型约束
class Book implements Printable {
print() {
console.log("Printing book...");
}
}
printItem(new Book()); // 输出 "Printing book..."
在上面的示例中,Printable
是一个接口,要求实现类必须有print
方法。泛型函数printItem
接受一个泛型参数T
,并通过extends Printable
进行泛型约束,表示T
必须满足Printable
接口的要求。在使用泛型函数时,我们传入一个Book
实例,因为Book
实现了Printable
接口,所以可以成功调用print
方法。
泛型是TypeScript中一个非常强大和灵活的特性,它能够提高代码的可重用性和类型安全性。通过使用泛型,我们可以编写更通用的代码,并且在编译时获得更好的类型检查。