#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. Все, что это делает, — это преобразуется в строку; исходный тип уже является объединением чисел.