You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript模板字面量类型中多个infer关键字的正确用法咨询

关于TypeScript模板字面量中多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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 13:17:40