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

TypeScript中$符号语法解析及Capitalize工具类型疑问解答

TypeScript Capitalize工具类型实现的两个疑问解答

先看这份来自GitHub提案的Capitalize工具类型实现示例:

type Capitalize<S extends string> = S extends `${infer C}${infer $S}`
  ? `${Uppercase<C>}${$S}`
  : never;

疑问1:TypeScript如何识别${infer C}代表字符串的首字母?

这是TypeScript字符串模板类型的匹配规则决定的:当模板中没有明确的分隔字符(比如固定字符串、正则式)时,TypeScript会对第一个infer变量进行最小匹配——也就是只捕获单个字符,所以C会被赋值为字符串的首字母。

举个实际例子验证:

type WordPart<S extends string> = S extends `${infer C}${infer R}`
  ? `${C}`
  : never;
type Part = WordPart<'hello'>; // Part的类型为'h'

如果我们给模板加上明确的匹配字符,比如:

type WordPart<S extends string> = S extends `${infer C}l${infer R}`
  ? `${C}`
  : never;
type Part = WordPart<'hello'>; // Part的类型为'he'

此时TypeScript会找到第一个匹配的l,把l之前的所有内容赋值给C,剩余部分存入R(这里R是'lo')。

疑问2:$S语法的含义是什么?

$S只是一个普通的类型变量名,$仅仅是变量名的一部分,没有特殊语法意义。这只是示例代码里的命名习惯,用来和常规变量名区分,或者直观表示这是字符串的「剩余部分」——你完全可以把它换成Rest或者其他合法的变量名,功能不会有任何变化。


补充说明

上述代码并非TypeScript内置Capitalize工具类型的实际实现。部分TS内置工具类型采用了直接调用JavaScript字符串运行时函数的方式实现,而非用类型逻辑,原因是TypeScript目前对长字符串的迭代支持不佳,容易出现类型计算溢出的问题。

内容的提问来源于stack exchange,提问作者Slava.In

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 05:20:29