条件类型 T extends U ? X : Y 按类型层面的可赋值性二选一,是 Exclude、Extract、NonNullable、ReturnType 等内置工具类型的基础。当 T 是裸类型参数且传入联合类型时会发生「分布式」:联合的每个成员分别代入求值再联合起来——Exclude<'a'|'b', 'a'> 等价于 ('a' extends 'a' ? never : 'a') | ('b' extends 'a' ? never : 'b'),结果是 'b'。
阻止分布式可把两边包成元组:[T] extends [U] ? X : Y。常见应用是实现 MyReturnType:T extends (...args: any[]) => infer R ? R : never。易错点:条件类型惰性求值,递归过深会触发 TS2589 类型实例化过深;any 代入会同时取两个分支的联合;never 代入裸参数整体得到 never。追问:与 infer 配合做类型提取、与模板字面量类型结合解析字符串。
type MyExclude<T, U> = T extends U ? never : T