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

TypeScript模板字面量多插值推断机制及前缀提取问题

TypeScript模板字面量infer匹配问题解析与解决方案

问题原因:语法限制而非Bug

你遇到的情况是TypeScript模板字面量类型推断的语法限制,不是Bug。具体原因:

  • 使用${infer P}${number}这种无分隔符的模式时,TypeScript无法明确区分前缀P和数字部分的边界——数字部分可以是任意长度的合法数字字符串,前缀P也可包含任意字符,这种歧义导致类型推断器无法确定唯一匹配结果,最终返回never。
  • 而${infer P}.${number}模式因为有明确的分隔符.,TypeScript能清晰地将.之前的部分推断为P,后面的部分匹配数字类型,因此能得到正确结果。

提取数字前缀的解决方案

要提取Foo123这类字符串的非数字前缀,可通过递归条件类型实现:

// 递归提取非数字前缀,遇到第一个数字字符停止
type ExtractPrefix<T extends string> = 
  T extends `${infer First}${infer Rest}` 
    ? First extends `${number}` 
      ? '' 
      : `${First}${ExtractPrefix<Rest>}`
    : '';

// 测试用例
type T3 = ExtractPrefix<'Foo123'>; // 结果:"Foo"
type T4 = ExtractPrefix<'Test123abc456'>; // 结果:"Test"
type T5 = ExtractPrefix<'123Foo'>; // 结果:""(开头就是数字,无前缀)
type T6 = ExtractPrefix<'FooBar'>; // 结果:"FooBar"(无数字,返回完整字符串)

这个类型的逻辑是逐字符遍历输入字符串:

  • 如果当前字符是数字,立即返回空字符串,终止递归;
  • 如果当前字符非数字,就将其与剩余字符串的提取结果拼接,继续递归。

内容的提问来源于stack exchange,提问作者riv

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 06:53:23