infer infer 关键字
最后更新:2026-10-22
infer infer 关键字
infer 在条件类型的真分支里"捕获"类型:T extends Array<infer U> ? U : never 意思是"如果 T 是数组,就把元素类型抠出来叫 U"。它让类型从"匹配即丢弃"升级为"匹配并提取",是 Unwrap、ReturnType 这类工具类型的核心。
| 分组 | 泛型 |
|---|---|
| 类型 | 操作符 |
| 严格模式 | 不需要 |
ℹ️ 说明 编辑器将 TypeScript 转译为 JavaScript 后运行(不做类型检查);类型检查结果见示例 Output。
📝 语法
type ItemOf<T> = T extends Array<infer U> ? U : never;
type A = ItemOf<string[]>; // string
type B = ItemOf<number[]>; // number
// infer 可以出现在模式的任意位置
type FirstArg<T> = T extends (first: infer A, ...rest: any[]) => any ? A : never;
⚙️ 参数
| infer U | 类型占位声明:在 extends 匹配过程中把某位置的类型捕获到 U |
|---|---|
| T extends X ? U : Y | 只在当前条件类型的真分支内有效,分支外不可见 |
返回值:infer 本身不是类型,是匹配过程中的"绑定";整个条件类型的返回值由捕获结果参与运算得出。
▶ 示例
修改下面的代码,点击试一试查看转译运行结果:
输出:
11 A
(转译后运行输出;n 和 s 在编译期分别是 number 和 string——infer 从数组类型里抠出了元素类型)
💡 要点
ℹ️ 说明 infer 可以出现在 extends 模式的任意位置:Promise<infer U> 抓 resolve 类型、[any, infer R] 抓元组第二位、(x: infer P) => any 抓参数——位置即语义。
💡 提示 同名 infer 多次出现会触发"合并推断":[infer T, infer T] 匹配 [number, number] 得 number,匹配 [string, number] 则整体失败——天然的"类型一致性检查"。
⚠️ 注意 infer 只能在条件类型的 extends 子句里使用,单独写 type U = infer X 是语法错误;false 分支里也不能引用 U。
🏷️ 相关泛型
💡 相关案例
更多案例即将上线。
📚 相关教程
❓ 常见问题
Q infer 和泛型参数 <T> 有什么区别?
A 泛型参数是"调用方给我",infer 是"我从已有类型里抠出来"。前者声明输入,后者提取信息——ReturnType<T> 就是从函数类型里 infer 返回值。
Q 匹配不上时 infer 捕获的 U 是什么?
A 没有匹配就没有绑定——直接走 false 分支。所以 false 分支通常写 never 或 unknown 作为兜底。
Q 内置工具里哪些用了 infer?
A ReturnType、Parameters、ConstructorParameters、Awaited 等:都是 extends + infer 的组合拳,学会 infer 就能看懂大半个工具类型源码。