如何简化TypeScript中2的幂长联合类型的定义?
解决方案
可以通过数组长度模拟数值翻倍的方式,绕过TypeScript类型系统不支持直接数值运算的限制,递归生成1到2^30的2的幂联合类型:
// 用数组合并实现数值翻倍:将两个长度为N的数组合并,新数组长度就是2*N type Double<N extends number> = [...Array<N>, ...Array<N>]['length']; // 递归生成2的幂序列,直到达到2^30 type PowerOf2Sequence< Current extends number = 1, Accumulated extends number = Current, Max extends number = 1073741824 // 2^30的具体值 > = Current extends Max ? Accumulated | Current : PowerOf2Sequence<Double<Current>, Accumulated | Current, Max>; // 使用示例 type PowersOf2 = PowerOf2Sequence; // 最终类型为 1 | 2 | 4 | 8 | ... | 1073741824
原理说明
TypeScript的类型系统不支持+、*、<<这类直接数值运算,但可以利用数组的length属性间接表示数值:
Double<N>通过合并两个长度为N的数组,得到长度为2*N的数组,其length类型就是翻倍后的数值。PowerOf2Sequence从初始值1开始递归,每次将当前值翻倍,同时把所有生成的2的幂收集到联合类型中,直到当前值等于2^30时终止递归。
针对你尝试方案的补充
你之前用递归数组生成连续数字的思路是对的,但因为类型系统不支持位运算导致失败。上面的方案用数组合并的方式模拟了翻倍操作,完美适配类型系统的限制,不需要手动编写所有数值。
内容的提问来源于stack exchange,提问作者Ausprain
相关产品推荐
相关产品推荐

