在TypeScript(TS)中,泛型(Generics)是一种强大的工具,它允许你在创建组件(如接口、类、函数等)时定义一些可复用的类型。使用泛型,你可以创建灵活的组件,这些组件可以工作于多种数据类型上,而不是仅限于某个具体的类型。这样做的好处是提高了代码的重用性、可读性和可维护性。
基本概念
泛型主要通过在定义组件时使用一个或多个类型参数来工作。这些类型参数在组件被实例化时会被具体的类型所替换。类型参数用尖括号 <>
包围,并通常是大写字母,如 T
、U
、V
等,但这只是一个约定,并不是强制性的。
示例
泛型函数
function identity<T>(arg: T): T {
return arg;
}
let output = identity<string>("myString"); // 类型参数为 string
let outputNum = identity(42); // TypeScript 会自动推断出 T 是 number
泛型接口
interface GenericIdentityFn<T> {
(arg: T): T;
}
let myIdentity: GenericIdentityFn<number> = (x) => x;
泛型类
class GenericNumber<T> {
zeroValue: T;
add: (x: T, y: T) => T;
constructor(zero: T, add: (x: T, y: T) => T) {
this.zeroValue = zero;
this.add = add;
}
zero(): T {
return this.zeroValue;
}
addNumbers(x: T, y: T): T {
return this.add(x, y);
}
}
let myGenericNumber = new GenericNumber<number>(0, (x, y) => x + y);
泛型的好处
- 代码复用:你可以编写一个与数据类型无关的组件,然后在多个地方以不同的数据类型来重用它。
- 类型安全:在编译时,TypeScript 能够利用泛型来提供更严格的类型检查。
- 清晰和自文档化:泛型通过类型参数使组件的意图更加明显,增加了代码的可读性和可维护性。
总结
泛型是TypeScript中一个非常重要的特性,它允许你编写灵活、可重用且类型安全的代码。通过定义类型参数,你可以创建能够在多种数据类型上工作的组件,同时保持代码的清晰和可维护性。