见TS4.1 ANSWER:
type WeekdayType = `${Weekday}`;
TS-4.1 之前的答案:
这不能以编程方式完成...您正在尝试将类型 Weekday(即 Weekday.MONDAY | Weekday.TUESDAY | Weekday.WEDNESDAY)转换为类型 WeekdayType(即 "mon" | "tue" | "wed")。这种转换是一种加宽的形式,因为Weekday是WeekdayType的子类型:
type WeekdayExtendsWeekdayType =
Weekday extends WeekdayType ? true : false
// type WeekdayExtendsWeekdayType = true
不幸的是,编译器没有给你一个句柄来从枚举类型中删除“枚举”-ness 并留下纯文字类型。
那么,解决方法?也许您实际上并不需要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 的 值 的行为就像一个枚举对象:
console.log(Weekday.TUESDAY); // tue
而名为Weekday 的类型 的行为类似于您调用的"mon" | "tue" | "wed" 字符串值的联合WeekdayType:
const w: Weekday = "wed"; // okay
const x: Weekday = "xed"; // error
因此,在此解决方法中,没有“枚举”-ness,因此无需区分类型 Weekday 和类型 WeekdayType。它与实际的 enum 有点不同(其中包括 types,例如 Weekday.MONDAY,您必须将其表示为繁琐的 typeof Weekday.MONDAY 或为其创建不同的类型别名),但是它的行为可能足够相似以至于有用。这对你有用吗?
希望对您有所帮助。祝你好运!