TypeScript中如何将字符串字面量联合类型转换为数字字面量联合类型
TypeScript 字符串字面量联合类型转数字字面量联合类型方案
可以实现该转换,在TypeScript 4.8及更高版本中,可借助模板字面量类型的数字推断能力完成需求。
核心转换泛型
type StringToNumber<T extends string> = T extends `${infer Num extends number}` ? Num : never;
基础使用示例
对应你给出的示例,直接传入字符串联合类型即可得到目标数字联合类型:
type A = '7' | '8' | '9' type B = StringToNumber<A> // 等价于 type B = 7 | 8 | 9
支持的数字格式
该转换逻辑支持任意合法的数字格式字符串,不限于单数字、正整数:
type TestStr = '-123' | '3.1415926' | '1008611' type TestNum = StringToNumber<TestStr> // 等价于 type TestNum = -123 | 3.1415926 | 1008611
注意事项
- 如果传入的字符串联合中包含无法解析为数字的成员,该成员会被转换为
never,最终联合类型会自动过滤never,相当于自动排除非数字字符串:type MixStr = '12' | '非数字' | '45.6' type MixNum = StringToNumber<MixStr> // 等价于 type MixNum = 12 | 45.6 - 若字符串对应的数字超出JavaScript Number类型的安全精度范围,转换后会遵循JS的数字精度规则,可能出现精度丢失。
- 低于4.8的TypeScript版本不支持
infer 泛型 extends 类型的语法,需要升级TS版本后使用该方案。
内容的提问来源于stack exchange,提问作者loveyunk
相关产品推荐
相关产品推荐

