TypeScript 泛型
泛型 = 「带参数的类型」,让组件既有明确的 API 又能复用于不同数据类型。
TypeScript 泛型
官方定义很直白:泛型就是「带参数的类型」(types which take parameters)。
软件工程里最重要的能力之一就是构造可复用的组件 —— 组件既要有明确一致的 API,也要能适配不同数据类型。
1. 为什么需要它
没有泛型时,要写「返回参数本身」的函数,只能这么办:
function identity(arg: any): any { return arg; }const n = identity(42); // n 的类型是 any —— 类型信息丢了用 any 的问题:传进去的类型和拿出来的类型脱钩,失去了类型检查的意义。
2. 改用泛型
function identity<T>(arg: T): T { return arg; }
const n = identity(42); // T 推断为 numberconst s = identity("hello"); // T 推断为 stringT 是类型变量 —— 它捕获调用者传入的类型,然后在整个签名里复用。
3. 泛型约束(Constraints)
有时你要用参数身上的某个属性,但编译器不知道它有:
function longest<T extends { length: number }>(a: T, b: T) { return a.length >= b.length ? a : b;}extends 在这里是约束而不是继承 —— 它表示「T 至少要有 length」。
4. 两类写法
| 写法 | 调用方式 | 说明 |
|---|---|---|
function f<T>(arg: T): T | f(x) —— 自动推断 | 最常用 |
let g: <T>(arg: T) => T | 把泛型写在类型上 | 需要显式声明类型时 |
5. 易错点
· 不要在泛型函数里假设 T 具体是什么 —— 除非用 extends 约束过;
· 泛型参数默认值:<T = string> 让调用者可以省略;
· 不该用泛型的场景:只有一个具体类型时,直接写那个类型更清楚。
引用了这个词条的文章
- MDX 集成与 M3E 原子组件TypeScript 泛型
- 新人报到:我为什么开始写博客TypeScript 泛型
