问题

我想声明一个2的幂的类型,范围从1到2^30,如下所示:

declare type A = 1 | 2 | 4 | 8 | ... | 1073741824

但我不想写太多数字.

有没有什么简单的办法?

try

我try 声明一个类型帮助器来初始化一个从0到9的10个数字的类型,如下所示:

type FlagHelper<N extends number, R extends number[] = []> = 
    R['length'] extends N 
        ? R[number] 
        : FlagHelper<N, [...R, R['length']]>

type A = FlagHelper<10>
// type A = 0 | 1 | 2 | 3 | ... | 9 

so i just only change :FlagHelper<N, [...R, R['length']] to :FlagHelper<N, [...R, 1 << R['length']] can feed my need.
but TypeScript type definition do not support any operators like +,-,*,<< etc.

推荐答案

你不能百分百地用类型做数学运算.你可以这样做,但正如你注意到的,它涉及到构建特定长度的元组类型来表示整数.

请参阅:https://itnext.io/implementing-arithmetic-within-typescripts-type-system-a1ef140a6f6f

这意味着如果您想要在一个类型中派生2^30,您最终将不得不创建一个长度为2^30的元组类型.

但这是行不通的:

// Creates a tuple type of length `N`.
type Tuple<N extends number, Current extends any[] = []> =
  Current["length"] extends N
    ? Current
    : Tuple<N, [unknown, ...Current]>

type A = Tuple<1073741824>
// Type instantiation is excessively deep and possibly infinite.(2589)

在这里,TypeScriptry 执行递归类型10亿次,然后在它完成之前放弃,以防止内存运行和/或独占您的CPU.

Tuple<999>似乎是放弃之前的最高值,这让你距离目标有6个数量级的距离.这是一个不小的差距.


但2的力量并不会改变,这也不是一个很大的 list .

因此,我只需编写一些代码来为我生成此类型,例如:

function createPowersOfTwoType(maxPower) {
  const values = []

  for (let i = 0; i <= maxPower; i++) {
    values.push(Math.pow(2, i))
  }

  const lines = values.map(value => `  | ${value}`).join('\n')
  return `Type A =\n${lines}`
}

console.log(createPowersOfTwoType(30))

并将结果粘贴到您的代码库中.

Typescript相关问答推荐

node—redis:如何在redis timeSeries上查询argmin?

typescript抱怨值可以是未定义的,尽管类型没有定义

类型脚本强制泛型类型安全

带占位符的模板文字类型何时扩展另一个?

部分类型化非 struct 化对象参数

泛型类型联合将参数转换为Never

是否使用非显式名称隔离在对象属性上声明的接口的内部类型?

在打印脚本中使用泛型扩展抽象类

为什么我的导航在使用Typescript的React Native中不起作用?

API文件夹内的工作员getAuth()帮助器返回:{UserID:空}

自定义 Select 组件的类型问题:使用带逗号的泛型类型<;T与不带逗号的<;T&>;时出错

使用或属性编写无限嵌套的接口

创建一个TypeScrip对象并基于来自输入对象的约束定义其类型

使用Type脚本更新对象属性

声明遵循映射类型的接口

类型脚本中参数为`T`和`t|unfined`的重载函数

完全在类型系统中构建的东西意味着什么?

如何根据Typescript 中带有泛型的对象嵌套键数组获取数组或对象的正确类型?

如何为字符串模板文字创建类型保护

在 TypeScript 中实现类型级别深度优先搜索