infer 只能用在条件类型的 extends 分支中,声明一个待推断的类型变量,TS 匹配成功后把对应位置的类型捕获出来。经典应用:ReturnType = T extends (...args: any[]) => infer R ? R : never;Parameters、InstanceType、Awaited(递归解包 Promise)同理,本质都是「模式匹配加提取」。

infer 可出现在数组或元组位置做首尾提取:type Head = T extends [infer H, ...unknown[]] ? H : never;配合模板字面量可解析字符串:T extends ${infer A}-${infer B}。TS 4.8 起支持 infer S extends string 直接给推断结果加约束,省去二次判断。易错点:函数参数位置的 infer 是逆变的,多个候选会推成交叉类型;infer 不能用在条件类型之外;匹配失败走 false 分支。追问:用递归加 infer 实现类型级 URL 参数解析、JSON parser 的思路。

type Awaited2<T> = T extends Promise<infer U> ? Awaited2<U> : T