高级类型
在联合 / 交叉之上,条件类型与 infer 是「类型级编程」的入口。
联合与交叉回顾
type A = { a: number };
type B = { b: string };
type Both = A & B; // 同时有 a、b
type Either = A | B; // 使用前常需收窄
条件类型
type IsString<T> = T extends string ? true : false;
type A = IsString<"hi">; // true
type B = IsString<1>; // false
分发:裸类型参数上的条件类型会对联合逐成员分发:
type ToArray<T> = T extends unknown ? T[] : never;
type R = ToArray<string | number>; // string[] | number[]
infer 直觉
在条件类型的 extends 臂里「取出」一部分类型:
type Elem<T> = T extends (infer U)[] ? U : never;
type E = Elem<string[]>; // string
type AwaitedSimple<T> = T extends Promise<infer U> ? U : T;
官方已有 Awaited<T> 等内置工具;先理解 infer 在做什么即可。
何时用
- 库作者:从已有类型推导派生类型
- 业务代码:多数时候联合 + 收窄 + 小工具类型就够
要点
&组合、|选择T extends X ? A : Binfer从模式里抽类型- 业务侧保持简单,复杂推导留给库边界