我正在创建一个元组,它可以通过枚举进行索引。令我惊讶的是,这有效,因为 TS 理解枚举和元组的长度。但是,在编写元组的类型时,我找不到将其与枚举关联起来的方法:
enum E {
ITEM1,
ITEM2,
// ITEM3,
}
declare const e: E;
declare const myTuple: [string, string];
myTuple[e];
取消注释ITEM3
会导致错误,我还必须手动向元组添加更多元素。然而,元组正在生成。如果编辑枚举就足够了(一如既往,有一个用于更改的中心位置),我会更喜欢。
遗憾的是,据我所知 TS 无法将对象键(例如枚举的键)转换为元组类型,即使只是计数。
真的没有比在枚举中添加元素时手动向元组类型添加一个更好的方法了吗?我正在考虑as unknown as string[] & Record<E, string>
的世界末日 Actor 阵容。虽然这是极其不干净的,并且会破坏.length
,或对其类型的操作,这是迄今为止我能找到的最好的。也许有两个地方可以编辑的酸苹果仍然是更好的选择。
tl;博士;我怎样才能获得一个元组类型,它总是可以通过枚举进行索引(具有相同的长度)?
最佳答案
这是一种方法:
type EnumToTuple<T extends number, V, A extends V[] = []> =
`${T}` extends keyof A ? A : EnumToTuple<T, V, [...A, V]>
EnumToTuple<T, V>
是 tail-recursive conditional type从空元组开始并不断附加 V
直到它具有与 T
“相同的长度”数字枚举。好吧,它会一直追加,直到元组具有与 T
的字符串化版本相对应的键为止。枚举。
所以对于这个:
enum E {
ITEM1,
ITEM2,
ITEM3,
}
declare const e: E;
type ETuple = EnumToTuple<E, string>;
// type ETuple = [string, string, string]
EnumToTuple<E, string>
类型不断追加string
到累积的元组直到 "0" | "1" | "2"
是它的键,首先发生在 [string, string, string]
。这意味着 ETuple
类型的值已知有 string
E
类型键的属性:
declare const myTuple: ETuple
myTuple[e].toUpperCase(); // okay
关于typescript - 创建枚举和元组类型之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73094075/