TypeScript模板字面量类型中多个infer关键字的正确用法咨询
infer推断的官方依据疑问 问题描述
在理解TypeScript模板字面量类型的infer关键字行为时,遇到了多次使用infer的场景。为实现snake_case键转camelCase的类型转换,我找到了一段代码,但其中S extends ${infer T}_${infer U}``的多推断模式匹配用法,在官方文档及常见资料中未找到明确说明。
代码示例如下:
type Test = { 'hello_there': string; 'another_snake_case': number; }; type SnakeToCamelCase<S extends string> = S extends `${infer T}_${infer U}` ? `${T}${Capitalize<SnakeToCamelCase<U>>}` : S; // 转换对象键的类型 type OutputType<InputType extends Record<string, unknown>> = { [K in keyof InputType as SnakeToCamelCase<K & string>]: InputType[K] }; type CamelCaseOutput = OutputType<Test>;
我能理解代码逻辑:当S为'another_snake_case'时,T会被推断为'another',U为'snake_case',进而递归处理剩余部分。但我需要找到这种多infer用法的官方参考依据。
解答
这种在模板字面量中同时使用多个infer的用法,是TypeScript模板字面量类型模式匹配的标准内置行为,属于模板字面量类型推断能力的自然延伸,官方文档虽未单独针对多infer场景做示例,但在核心规则中已有覆盖:
模板字面量的模式匹配逻辑
模板字面量类型的模式匹配,本质是将目标字符串与由字面量、类型变量、infer占位符组成的模板进行匹配。当模板中包含多个infer占位符时,TypeScript会按照从左到右的顺序,将匹配到的对应字符串片段分别赋值给每个infer声明的类型变量。
以S extends${infer T}_${infer U}``为例:匹配规则会先捕获下划线_之前的最长可能字符串作为T的值,下划线之后的剩余全部字符串则被捕获为U的值,这是一种贪婪匹配逻辑,确保每个infer占位符能捕获到符合模板结构的最大有效片段。官方文档的隐含说明
在TypeScript官方手册的「Template Literal Types」章节中,明确提到了可以使用infer来提取模板字面量中的部分内容。虽然手册中多以单个infer的示例为主,但模板字面量的模式本身支持任意数量的静态片段与infer占位符组合——只要模板结构与目标字符串的格式匹配,多个infer就能分别捕获对应的片段。这种用法是模式匹配能力的基础扩展,符合TypeScript类型系统的设计逻辑。逻辑合理性验证
从类型系统的设计角度,模板字面量的拼接(${A}${B})与拆分(infer A+infer B)是互逆操作。既然TypeScript允许将多个类型变量拼接成模板字面量,自然也支持将一个完整的字符串拆分为多个infer捕获的片段,这是类型系统一致性的体现。
内容的提问来源于stack exchange,提问作者SebJS74

