我想从枚举中得到一个字符串文字并集.

对于这个枚举…

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

…我想得到这个:

type WeekdayType = 'mon' | 'tue' | 'wed';

我试了typeof keyof Weekday次,结果是'MONDAY' | 'TUESDAY' | 'WEDNESDAY'次.我觉得这个解决方案可能与映射类型有关,但我似乎对此束手无策.

我该怎么做?

推荐答案

TS4.1 ANSWER:

type WeekdayType = `${Weekday}`;

TS-4.1之前的答案:

这不能通过编程实现...你想把Weekday型,也就是Weekday.MONDAY | Weekday.TUESDAY | Weekday.WEDNESDAY型,转换成WeekdayType型,也就是"mon" | "tue" | "wed"型.这种转换是widening的一种形式,因为WeekdayWeekdayType的一个子类型:

type WeekdayExtendsWeekdayType = 
  Weekday extends WeekdayType ? true : false
// type WeekdayExtendsWeekdayType = true

不幸的是,编译器没有给你一个从枚举类型中删除"enum"的句柄,而留给你的是纯文本类型.


那么,变通办法呢?也许你实际上不需要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],

如果对其进行判断,则名为Weekdayvalue的行为类似于枚举对象:

console.log(Weekday.TUESDAY); // tue

名为Weekdaytype的行为类似于您调用WeekdayType的字符串值"mon" | "tue" | "wed"的并集:

const w: Weekday = "wed"; // okay
const x: Weekday = "xed"; // error

因此,在这个解决方案中,没有"枚举"属性,因此不需要区分类型Weekday和类型WeekdayType.它与实际的enum有点不同(包括types,比如Weekday.MONDAY,您必须将其表示为笨重的typeof Weekday.MONDAY或为其创建不同的类型别名),但它的行为可能非常相似,因此非常有用.这对你有用吗?

希望有帮助.祝你好运

Typescript相关问答推荐

如何根据服务响应构建子路由

Angular 垫页分类和垫排序不起作用

类型脚本如何将嵌套的通用类型展开为父通用类型

使用FormArray在Angular中添加排序

无法从应用程序内的库导入组件NX Expo React Native

无法将select选项的值设置为ngFor循环中的第一个元素

根据上一个参数值查找参数类型,也返回类型

material 表不渲染任何数据

使用泛型keyof索引类型以在if-condition内类型推断

如何在另一个参数类型中获取一个参数字段的类型?

在列表的指令中使用intersectionObservable隐藏按钮

通过泛型函数本身推断受约束的泛型参数的类型脚本问题

如何将父属性类型判断传播到子属性

(TypeScript)TypeError:无法读取未定义的属性(正在读取映射)"

使用泛型识别对象值类型

为什么发送空字段?

如何键入并类型的函数&S各属性

有没有更干净的方法来更新**key of T**的值?

获取类属性的类型';TypeScript中的getter/setter

Typescript循环函数引用