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 就能看懂大半个工具类型源码。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏