Typescript: строковый литерал, объединяющий тип из enum - PullRequest
0 голосов
/ 18 сентября 2018

Я хотел бы получить строковое литеральное объединение из перечисления.

Для этого перечисления…

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

… Я хотел бы получить это:

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

Я пытался typeof keyof Weekday, но это привело к 'MONDAY' | 'TUESDAY' | 'WEDNESDAY'.Чувствую, что решение может быть связано с отображаемыми типами, но я не могу обернуться вокруг него.

Как мне это сделать?

1 Ответ

0 голосов
/ 19 сентября 2018

Это не может быть сделано программно ... вы пытаетесь преобразовать тип 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 или создать для него псевдоним другого типа), но этоможет вести себя так же, чтобы быть полезным.Это работает для вас?

Надеюсь, это поможет.Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...