首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建枚举与元组类型之间的关系

问创建枚举与元组类型之间的关系
EN

Stack Overflow用户
提问于 2022-07-23 20:43:57
回答 1查看 96关注 0票数 2

我正在创建一个元组,它可以通过枚举进行索引。令我惊讶的是,这是可行的,因为TS理解枚举和元组的长度。但是,在编写元组类型时,我无法将其与枚举关联起来:

代码语言:javascript
复制
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,或其类型的操作,这是迄今为止我能找到的最好的。也许有两个地方可以编辑的酸涩苹果仍然是更好的。

我如何才能得到一个元组类型,它总是可以由枚举(长度相同)索引?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-23 21:47:46

这里有一个方法:

代码语言:javascript
复制
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枚举的字符串版本相对应的键之前,它一直在追加。

因此,对于这一点:

代码语言:javascript
复制
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属性。

代码语言:javascript
复制
declare const myTuple: ETuple
myTuple[e].toUpperCase(); // okay

操场链接到代码

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73094075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档