gpt4 book ai didi

typescript - 如何在 TypeScript 类型定义中简化定义长联合类型

转载 作者:行者123 更新时间:2023-12-03 07:51:21 25 4
gpt4 key购买 nike

问题

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

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

但我不想写太多数字。

有没有什么简单的方法?

尝试

我尝试声明一个类型助手来初始化 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

所以我只是改变:FlagHelper<N, [...R, R['length']]:FlagHelper<N, [...R, 1 << R['length']]可以满足我的需要。
但 TypeScript 类型定义不支持任何运算符,如 +,-,*,<<等等

最佳答案

你不能真正使用类型进行数学计算。嗯,您可以,但正如您所注意到的,它涉及构建特定长度的元组类型来表示整数。

参见: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)

这里,Typescript 尝试执行该递归类型 10 亿次,然后在完成之前放弃,以防止运行内存和/或独占 CPU。

Tuple<999>似乎是放弃之前的最高水平,这使您距离目标有 6 个数量级。这可不是一个小差距。


但这并不是说两个人的力量永远会改变,也不是一个很大的列表。

所以我只需编写一些代码来为我生成这种类型,例如:

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 - 如何在 TypeScript 类型定义中简化定义长联合类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77064002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com