TypeScript 泛型:从「能用」到「好用」
泛型是 TypeScript 里最容易「会写但写不好」的部分。这篇用几个小例子过一遍。
约束:extends 不是继承
function pluck<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
pluck({ name: 'Sakura', age: 3 }, 'name'); // string
K extends keyof T 的意思是「K 必须是 T 的某个键」,这里的 extends 读作可赋值给。
让编译器替你推断
能让编译器推断的,就别手写。比如一个只读元组:
const seasons = ['春', '夏', '秋', '冬'] as const;
type Season = (typeof seasons)[number]; // '春' | '夏' | '秋' | '冬'
条件类型与 infer
type Awaited2<T> = T extends Promise<infer U> ? Awaited2<U> : T;
type A = Awaited2<Promise<Promise<number>>>; // number
条件类型遇到联合类型时会分发:
T extends X ? A : B会对联合的每一项分别计算。
小结
- 先写具体类型,重复三次再抽象成泛型
- 约束越精确,推断越聪明
- 条件类型很强,但可读性要自己负责
完

留言 COMMENTS
评论区尚未启用。到 giscus.app 生成参数,填进
src/config.ts的GISCUS里就好。