TypeScript如何实现typeof number类型的动态数值求和?
TypeScript类型层面实现数值求和
要实现你想要的类型层面的数值求和,直接用交叉类型T & typeof num1是行不通的——交叉类型用于合并类型交集,并非数值运算。TypeScript本身没有原生的数值类型运算能力,但可以借助它的递归模板类型特性,通过元组长度间接实现求和逻辑。
实现思路
核心逻辑基于元组长度的特性:
- 将数字转换为对应长度的元组(比如数字2对应
[unknown, unknown]) - 合并两个元组,合并后的元组长度即为两个数字的和
- 提取合并后元组的长度作为最终结果类型
具体代码实现
// 辅助类型:将数字转换为对应长度的元组 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
相关产品推荐
相关产品推荐

