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
相关产品推荐
相关产品推荐

