Typescript:枚举中的字符串文字联合类型

Typescript:枚举中的字符串文字联合类型,typescript,enums,Typescript,Enums,我想从枚举中获取字符串文字并集 对于此枚举 enum Weekday { MONDAY = 'mon', TUESDAY = 'tue', WEDNESDAY = 'wed' } …我想得到这个: type WeekdayType = 'mon' | 'tue' | 'wed'; 我尝试了typeof key of Weekday,但结果是“星期一”、“星期二”、“星期三”。我觉得这个解决方案可能与映射类型有关,但我似乎对此束手无策 我如何做到这一点?请参阅: TS

我想从枚举中获取字符串文字并集

对于此枚举

enum Weekday {
    MONDAY = 'mon',
    TUESDAY = 'tue',
    WEDNESDAY = 'wed'
}
…我想得到这个:

type WeekdayType = 'mon' | 'tue' | 'wed';
我尝试了
typeof key of Weekday
,但结果是
“星期一”、“星期二”、“星期三”
。我觉得这个解决方案可能与映射类型有关,但我似乎对此束手无策

我如何做到这一点?

请参阅:


TS-4.1之前的答案:

这不能以编程方式完成。。。您正在尝试将类型
Weekday
,即
Weekday.MONDAY | Weekday.周二| Weekday.周三
,转换为类型
Weekday类型
,即
“mon”|“tue”|“wed”
。此转换是一种加宽形式,因为
Weekday
WeekdayType
的子类型:

type WeekdayExtendsWeekdayType = 
  Weekday extends WeekdayType ? true : false
// type WeekdayExtendsWeekdayType = true
const w: Weekday = "wed"; // okay
const x: Weekday = "xed"; // error
不幸的是,编译器没有给你一个从枚举类型中删除“enum”的句柄,而留给你的是纯文本类型


那么,变通办法呢?也许您实际上不需要
枚举
,但可以处理属性值为字符串文字的对象:

const lit = <V extends keyof any>(v: V) => v;
const Weekday = {
  MONDAY: lit("mon"),
  TUESDAY: lit("tue"),
  WEDNESDAY: lit("wed")
}
type Weekday = (typeof Weekday)[keyof typeof Weekday],
而名为
Weekday
的类型的行为类似于您调用的
Weekday类型的字符串值的并集
“mon”|“tue”|“wed”

type WeekdayExtendsWeekdayType = 
  Weekday extends WeekdayType ? true : false
// type WeekdayExtendsWeekdayType = true
const w: Weekday = "wed"; // okay
const x: Weekday = "xed"; // error
因此,在这种解决方法中,没有“枚举”,因此不需要区分类型
Weekday
和类型
WeekdayType
。它与实际的
enum
(包括像
Weekday.MONDAY
这样的类型,您必须将其表示为烦琐的
Weekday.MONDAY类型,或者为其创建不同的类型别名)略有不同,但它的行为可能非常相似,因此非常有用。这对你有用吗


希望有帮助。祝你好运

键入脚本4.1+:

,这可以通过使用如下模板文字类型来实现:

type WeekdayType = `${Weekday}`;
TypeScript 3.4+:

继@jcalz answer和@just boris的评论之后,下面是一个const断言示例:

const Weekday = {
  MONDAY: "mon",
  TUESDAY: "tue",
  WEDNESDAY: "wed",
} as const;

type Weekday = (typeof Weekday)[keyof typeof Weekday];
编辑:

为那些想深入挖掘的人写了一篇文章。

有了,就可以做到了

enum Weekday {
  MONDAY = 'mon',
  TUESDAY = 'tue',
  WEDNESDAY = 'wed'
}

type WeekdayType = `${Weekday}`;

警告:这只适用于字符串枚举值,而不适用于数字枚举值。

很遗憾,您不能这样做。(有关更多信息,请参阅)。这太不幸了!更新:自typescript 3.4以来,不再需要特殊的
lit
功能。您可以使用insteadcurios question@jcalz。
做什么?它可以防止扩大任何类型的字符串/数字文字?谢谢有没有相反的方法?从字符串文本的并集类型中获取字符串枚举?@Pablo我不这么认为。谢谢。我绞尽脑汁想弄明白这一点。这应该行得通,但也有局限性type Weekday1=(typeof Weekday)[keyof typeof Weekday];键入Weekday2=
${Weekday}
;const day1:Weekday1=Weekday.MONDAY;=>工程施工第2天:工作日2=工作日。星期一;=>持续工作日3:Weekday1='mon'=>持续工作日4:Weekday2='mon';不工作works``一种更简单的方法是:键入WeekdayUnion=
${Weekday}
;就这样@谢谢你!使用ts node编译该文件是否成功?@MichaelG是的,您只需要在项目的package.json中将typescript版本更新为4.1。是否有人可以提供此行为的文档?!