TypeScript模板字面量类型如何推断得到数值字面量类型?
解决方案
TypeScript 4.8及以上版本支持直接在模板字面量的infer语法中添加数字类型约束,可一步得到数值字面量联合类型:
// 第三方库类型定义 type T = null | "auto" | "text0" | "text1" | "text2" | "text3" | "text4"; // 直接提取得到 0 | 1 | 2 | 3 | 4 类型 type N = Extract<T, `text${number}`> extends `text${infer R extends number}` ? R : never;
如果你的项目使用的是低于4.8的TS版本,可以额外封装一个字符串转数字的工具类型实现:
type StringToNumber<S extends string> = S extends `${infer Num extends number}` ? Num : never; // 原提取逻辑得到的字符串联合 type StrN = Extract<T, `text${number}`> extends `text${infer R}` ? R : never; // 转换为数值联合 type N = StringToNumber<StrN>;
原写法失效原因
你之前尝试用& number的方式不生效,是因为infer R得到的是字符串字面量类型,字符串类型和number类型的交叉结果为never,自然无法得到预期类型。
内容的提问来源于stack exchange,提问作者burtek
相关产品推荐
相关产品推荐

