我正在创建一个元组,它可以通过枚举进行索引。令我惊讶的是,这是可行的,因为TS理解枚举和元组的长度。但是,在编写元组类型时,我无法将其与枚举关联起来:
enum E {
ITEM1,
ITEM2,
// ITEM3,
}
declare const e: E;
declare const myTuple: [string, string];
myTuple[e];取消注释ITEM3将导致错误,我还必须手动向元组添加更多的元素。但是,元组正在生成。如果编辑枚举就足够了,我更希望(一如既往,有一个中心位置进行更改)。
遗憾的是,afaik TS无法将对象键(例如枚举的键)转换为元组类型,即使只是计数。
难道没有比在枚举中添加一个元素更好的方法了,也可以手动添加一个元组类型吗?我正在考虑as unknown as string[] & Record<E, string>的启示录。虽然这是非常不干净的,并破坏.length,或其类型的操作,这是迄今为止我能找到的最好的。也许有两个地方可以编辑的酸涩苹果仍然是更好的。
我如何才能得到一个元组类型,它总是可以由枚举(长度相同)索引?
发布于 2022-07-23 21:47:46
这里有一个方法:
type EnumToTuple<T extends number, V, A extends V[] = []> =
`${T}` extends keyof A ? A : EnumToTuple<T, V, [...A, V]>EnumToTuple<T, V>是一个以空元组开头的尾递归条件类型,它一直将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类型的值在E类型的键上具有一个string属性。
declare const myTuple: ETuple
myTuple[e].toUpperCase(); // okayhttps://stackoverflow.com/questions/73094075
复制相似问题