Как создать тип объединения из числовых значений перечисления?

#typescript

Вопрос:

Из перечисления:

 enum Weekdays {
  Monday = 1,
  Tuesday = 2
}
 

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

 type WeekdaysType = 1 | 2
 

Комментарии:

1. Weekdays сам по себе этот союз и есть.

2. Не совсем. Похоже, что происходит расширение типа, и результирующим типом является число: ` перечисление дней недели { Понедельник = 1, вторник = 2,}; константа c: Дни недели = 5 // без ошибок ` `

3. Если вы проверяете значения an enum , вам, вероятно, это не нужно enum . Почему бы не изменить его на const Weekdays = {Monday: 1, Tuesday: 2} as const; type WeekDays = (typeof Weekdays)[keyof typeof Weekdays] такой ? Каков здесь пример использования?

Ответ №1:

С помощью TypeScript 4.1 вы можете использовать типы литералов шаблонов:

 enum Weekdays {
  Monday = 1,
  Tuesday = 2,
};

type WeekdaysType = `${Weekdays}`;
 

Предостережение: Это работает только с перечислениями, которые имеют строковые значения, поэтому для вашего конкретного случая использования WeekdaysType будет "1" | "2" , а не 1 | 2 . Насколько мне известно, в настоящее время нет способа динамически извлекать числовые значения перечисления в тип объединения.

Игровая площадка для машинописи

Комментарии:

1. Не работает в том виде, в каком создан тип: type WeekdaysType = "1" | "2"

2. Пожалуйста, посмотрите мою правку с оговоркой. Насколько мне известно, начиная с TS 4.4, нет способа получить тип объединения из числовых значений перечисления.

3. Кроме того, я не верю, что существует какой-либо способ динамического преобразования строкового литерального типа в числовой литеральный тип.

4. Все, что это делает, — это преобразуется в строку; исходный тип уже является объединением чисел.