16. 什么是 infer?
目录一、 第一层通俗定义直击本质二、 第二层三大核心应用场景展现技术深度1. 提取异步任务的返回值2. 解构函数签名3. 模板字面量解析TS 4.1 炫技点三、 第三层进阶细节避坑与加分点四、 面试简答模板建议直接背诵回答思路简答模板 核心示例演示技术背书在 TypeScript 的高级面试中infer是一个压轴级别的知识点。它代表了你对 TS 类型系统从“静态描述”到“动态推导”的深度掌控。以下是为你准备的深度解析和面试答题模板一、 第一层通俗定义直击本质“infer是 TypeScript 中的‘类型占位符’或‘类型提取变量’。它只能在条件类型Conditional Types的extends子句中使用。其作用是告诉编译器在进行类型匹配时暂时不要去检查这个位置的具体类型而是由编译器在大脑中‘推断’infer出来并捕获到一个临时的变量中。”二、 第二层三大核心应用场景展现技术深度面试官最想看到你如何用infer去“钻取”复杂类型的内部细节1. 提取异步任务的返回值当我们处理Promise或Async函数时我们需要拿到它最终 Resolve 的那个类型。逻辑T extends Promiseinfer R ? R : T价值无论嵌套多深都能精准拿到“剥开包装”后的原始数据类型。2. 解构函数签名官方提供的ReturnTypeT和ParametersT的底层全靠infer。场景从一个函数类型中单独提取出它的返回值类型或者是它的参数元组Tuple。3. 模板字面量解析TS 4.1 炫技点在处理字符串字面量类型时可以用infer提取字符串的一部分。应用比如把get_user_info这种下划线命名自动推导成getUserInfo驼峰命名这被称为类型体操。三、 第三层进阶细节避坑与加分点位置限制它必须紧跟在extends关键字之后且只能在条件类型的“真分旬”即?之后的部分中使用。协变与逆变深度加分如果你能讲出infer在函数参数位逆变位会推导出联合类型在返回位协变位会推导出交叉类型面试官会直接给你打满分注此点较深除非被深挖否则点到为止。四、 面试简答模板建议直接背诵面试官谈谈你对 TypeScript 中 infer 关键字的理解回答模板“infer是 TypeScript 类型编程中实现‘自动解构’的核心关键字。我把它理解为类型系统的‘模式匹配变量’。当我们需要从一个复杂的组合类型比如 Promise、Array 或 Function中提取出内部的某个子类型时infer就派上用场了。在实际开发中我经常在以下三个场景用到它实现‘剥壳’操作比如编写一个Unpack工具类型利用T extends (infer U)[] ? U : T提取数组的元素类型或者提取 Promise 的返回类型。类型转换映射配合模板字面量类型我可以用infer动态解析字符串类型。例如实现一个将API_URL这种常量格式转换为对应参数结构的逻辑。复用第三方库类型当外部库导出了函数但没有单独导出参数类型时我会通过Parameterstypeof someLibraryFunc来反向获取它的类型。总之infer让 TypeScript 拥有了‘逆向推导’的能力使得我们的通用代码能够随着输入数据的变化而自动调整类型极大地减少了冗余的类型定义和不可靠的类型断言。”回答思路在条件类型中推断类型常用于提取函数返回值、Promise 值简答模板infer用于条件类型中推断某一部分类型。它可以理解为在类型系统里做“类型提取”。比如ReturnType就是通过infer提取函数的返回值类型。 核心示例演示技术背书// 1. 提取 ReturnType (仿官方实现) type MyReturnTypeT T extends (...args: any[]) infer R ? R : any; // 2. 提取 Promise 的值 type UnboxT T extends Promiseinfer V ? V : T; type StringResult UnboxPromisestring; // 得到 string // 3. 模板字面量提取极具表现力 type GetFirstNameS extends string S extends ${infer First} ${infer Last} ? First : S; type Name GetFirstNameJohn Doe; // 得到 John