跳到主要内容

高级类型

在联合 / 交叉之上,条件类型与 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 在做什么即可。

何时用​

  • 库作者:从已有类型推导派生类型
  • 业务代码:多数时候联合 + 收窄 + 小工具类型就够

要点​

  1. & 组合、| 选择
  2. T extends X ? A : B
  3. infer 从模式里抽类型
  4. 业务侧保持简单,复杂推导留给库边界