条件类型(Conditional Types)和 infer 关键字怎么用?
条件类型形如 T extends U ? X : Y,根据类型关系二选一;infer 用于在 extends 中推断并捕获子类型。
type IsString<T> = T extends string ? true : false
// 提取数组元素类型
type ElementOf<T> = T extends (infer E)[] ? E : T
type A = ElementOf<string[]> // string
// 提取函数返回值
type ReturnOf<T> = T extends (...args: any[]) => infer R ? R : never
type R = ReturnOf(() => number) // number
// 内置工具类型实现
type MyParameters<T> = T extends (...args: infer P) => any ? P : never分发(distributive):裸类型参数(如 T)在联合类型上会逐成员分发:type T = IsString<string | number> 会变成 true | false。加 [T] 包裹可关闭分发。