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

如何简化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属性间接表示数值:

  1. Double<N>通过合并两个长度为N的数组,得到长度为2*N的数组,其length类型就是翻倍后的数值。
  2. PowerOf2Sequence从初始值1开始递归,每次将当前值翻倍,同时把所有生成的2的幂收集到联合类型中,直到当前值等于2^30时终止递归。

针对你尝试方案的补充

你之前用递归数组生成连续数字的思路是对的,但因为类型系统不支持位运算导致失败。上面的方案用数组合并的方式模拟了翻倍操作,完美适配类型系统的限制,不需要手动编写所有数值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 16:02:51