infer 是 TypeScript 条件类型中用于类型模式匹配并提取子类型的关键词,必须与 extends 搭配使用;可提取函数返回值、参数元组、数组元素及 Promise 解析类型。

infer 是 TypeScript 条件类型中用于“在类型层面做模式匹配并自动提取子类型”的关键字。它不能单独使用,必须配合 extends 出现在条件类型的判断分支里,作用是声明一个待推断的类型变量,让编译器从目标结构中“抠出”你关心的那一部分类型。
提取函数返回值类型
这是最常用场景之一,原理是匹配函数签名,用 infer R 捕获箭头右侧的返回类型:
type MyReturnType<T> = T extends (...args: any) => infer R ? R : never;- 对
function foo(): { id: number } { return { id: 1 }; },MyReturnType<typeof foo>得到{ id: number } - TypeScript 内置的
ReturnType<T>就是这样实现的
提取函数全部参数类型(元组)
要获取所有参数组成的元组(含可选、rest),需匹配形参列表结构:
type MyParameters<T> = T extends (...args: infer P) => any ? P : never;- 对
function bar(a: string, b?: number, ...rest: boolean[]) {},结果是[string, number?, ...boolean[]] - 注意:不能写成
(a: infer P) => any,那只能捕获第一个参数;必须用...args: infer P才能完整提取
提取数组或元组的元素类型
利用数组字面量语法进行结构匹配,infer U 会代表方括号里的内容:
type ElementType<T> = T extends (infer U)[] ? U : never;- 对
string[]→string,对(number | null)[]→number | null - 对元组如
[string, number, boolean]同样生效,结果是string | number | boolean(联合类型)
提取 Promise 解析后的值类型
匹配 Promise<T> 结构,把泛型参数 T 推断出来:
type Awaited<T> = T extends Promise<infer U> ? U : T;- 对
Promise<string>→string,对Promise<{ name: string }>→{ name: string } - TypeScript 4.5+ 已内置
Awaited<T>,逻辑完全一致


















