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。是否有人可以提供此行为的文档?!