见TS4.1 ANSWER:
type WeekdayType = `${Weekday}`;
TS-4.1之前的答案:
这不能通过编程实现...你想把Weekday
型,也就是Weekday.MONDAY | Weekday.TUESDAY | Weekday.WEDNESDAY
型,转换成WeekdayType
型,也就是"mon" | "tue" | "wed"
型.这种转换是widening的一种形式,因为Weekday
是WeekdayType
的一个子类型:
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],
如果对其进行判断,则名为Weekday
的value的行为类似于枚举对象:
console.log(Weekday.TUESDAY); // tue
名为Weekday
的type的行为类似于您调用WeekdayType
的字符串值"mon" | "tue" | "wed"
的并集:
const w: Weekday = "wed"; // okay
const x: Weekday = "xed"; // error
因此,在这个解决方案中,没有"枚举"属性,因此不需要区分类型Weekday
和类型WeekdayType
.它与实际的enum
有点不同(包括types,比如Weekday.MONDAY
,您必须将其表示为笨重的typeof Weekday.MONDAY
或为其创建不同的类型别名),但它的行为可能非常相似,因此非常有用.这对你有用吗?
希望有帮助.祝你好运