撑伞的少女

TypeScript 泛型:从「能用」到「好用」

约 1 分钟读完

泛型是 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 里就好。

检索 SEARCH