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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 04:27:02