Это не может быть сделано программно ... вы пытаетесь преобразовать тип Weekday
, который равен Weekday.MONDAY | Weekday.TUESDAY | Weekday.WEDNESDAY
, в тип WeekdayType
, который равен "mon" | "tue" | "wed"
.Это преобразование является формой расширения , поскольку Weekday
является подтипом WeekdayType
:
type WeekdayExtendsWeekdayType =
Weekday extends WeekdayType ? true : false
// type WeekdayExtendsWeekdayType = true
К сожалению, компилятор не дает вам дескриптора для удаления "enum""-несс от типа 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],
Если вы проверите его, значение named Weekday
ведет себя как объект перечисления:
console.log(Weekday.TUESDAY); // tue
, в то время как тип с именем Weekday
ведет себя как объединение строковых значений "mon" | "tue" | "wed"
, которые вы вызывали WeekdayType
:
const w: Weekday = "wed"; // okay
const x: Weekday = "xed"; // error
Таким образом, в этом обходном пути нет "enum" -ness, и, следовательно, нет необходимости отличать тип Weekday
от типа WeekdayType
.Это немного отличается от фактического enum
(который включает в себя типов , таких как Weekday.MONDAY
, которые вы должны будете представить как громоздкие typeof Weekday.MONDAY
или создать для него псевдоним другого типа), но этоможет вести себя так же, чтобы быть полезным.Это работает для вас?
Надеюсь, это поможет.Удачи!