请参见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
很不幸,编译器没有为您提供从枚举类型中去除“枚举”属性并使其成为普通文字类型的句柄。
那么,解决方法呢?也许您实际上并不需要一个枚举
,而是可以使用一个属性值为字符串字面量的对象:
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)
尽管名为Weekday的type
表现得像字符串值"mon" | "tue" | "wed"
的联合体,而你之前将其称为WeekdayType
:
const w: Weekday = "wed"
const x: Weekday = "xed"
因此,在这个解决方法中,没有“枚举”的特性,因此无需区分类型Weekday
和类型WeekdayType
。这与实际的enum
略有不同(包括像Weekday.MONDAY
这样的类型,你必须将其表示为繁琐的typeof Weekday.MONDAY
或为其创建不同的类型别名),但它可能表现得足够相似以便于使用。对你有用吗?