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

TypeScript如何实现typeof number类型的动态数值求和?

TypeScript类型层面实现数值求和

要实现你想要的类型层面的数值求和,直接用交叉类型T & typeof num1是行不通的——交叉类型用于合并类型交集,并非数值运算。TypeScript本身没有原生的数值类型运算能力,但可以借助它的递归模板类型特性,通过元组长度间接实现求和逻辑。

实现思路

核心逻辑基于元组长度的特性:

  1. 将数字转换为对应长度的元组(比如数字2对应[unknown, unknown])
  2. 合并两个元组,合并后的元组长度即为两个数字的和
  3. 提取合并后元组的长度作为最终结果类型

具体代码实现

// 辅助类型:将数字转换为对应长度的元组
type NumberToTuple<N extends number, T extends unknown[] = []> = 
  T['length'] extends N ? T : NumberToTuple<N, [...T, unknown]>;

// 求和类型:合并两个元组后取长度
type Sum<A extends number, B extends number> = 
  [...NumberToTuple<A>, ...NumberToTuple<B>]['length'];

// 你的示例场景
const num1 = 12 as const; // 用as const确保typeof num1是字面量类型12,而非宽泛的number
type TotalNum<T extends number> = Sum<T, typeof num1>;

// 测试验证:TotalNum<2>的类型为14
type TestResult = TotalNum<2>; // 类型是14

关键注意事项

  • 必须使用字面量数字类型:如果num1不添加as const,typeof num1会被推断为宽泛的number类型,无法进行类型层面的精确运算。
  • 递归深度限制:TypeScript默认的类型递归深度约为1000,若求和的数字过大,可能会触发类型溢出错误。

内容的提问来源于stack exchange,提问作者ReshiLee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:25:28