如何在TypeScript类型表达式中静态将字符串常量转换为数字常量
TypeScript编译期字符串转数字字面量类型实现
我们可以通过模板字面量拆分、递归累加的方式实现通用的StrToNum类型,支持任意长度的整数字符串在编译期转换为对应数字字面量:
// 内部递归实现:逐位处理字符串数字,拼接累加为数字字面量 type StrToNumImpl< S extends string, Acc extends number = 0 > = S extends `${infer Digit extends `${number}`}${infer Rest}` ? StrToNumImpl<Rest, `${Acc}${Digit}` extends `${infer Num extends number}` ? Num : never> : Acc; // 对外类型:支持正负整数、非法输入返回never type StrToNum<T extends string> = T extends `-${infer Abs extends `${number}`}` ? StrToNumImpl<Abs> extends infer Num extends number ? -Num : never : T extends `${number}` ? StrToNumImpl<T> : never;
使用示例
type theAnswer = StrToNum<'42'>; // 类型:42 type positive = StrToNum<'123456'>; // 类型:123456 type leadingZero = StrToNum<'000789'>; // 类型:789 type negative = StrToNum<'-666'>; // 类型:-666 type invalidInput = StrToNum<'hello123'>; // 类型:never
实现说明
- 依赖TypeScript 4.5及以上版本的
infer X extends Type语法能力,支持直接从模板字面量中推断数字类型 - 递归逐位拆分字符串的数字字符,将累加器与当前字符拼接后重新推断为数字字面量,直到字符串处理完成
- 自动兼容负整数、前导零场景,非法数字字符串会返回
never类型
内容的提问来源于stack exchange,提问作者dylhunn
相关产品推荐
相关产品推荐

