Тип enum или перечисление позволяет определить набор именнованных констант, которые описывают определенные состояния.
Для определения перечисления применяется ключевое слово enum. Например, объявим следующее перечисление:
enum Season { Winter, Spring, Summer, Autumn };
Перечисление называется Season
и имеет четыре элемента. Теперь используем перечисление:
enum Season { Winter, Spring, Summer, Autumn }; let current: Season = Season.Summer; console.log(current); // 2 current = Season.Autumn; // изменение значения
Здесь создается переменная current
, которая имеет тип Season. При этом консоль браузера выведет нам число 2 - значение константы
Season.Summer
.
По умолчанию константы перечисления, как в примере выше, представляют числовые значения. То есть это так называемое числовое перечисление, в котором каждой константе сопоставляется числовое значение.
Так, созданное выше в примере перечисление
enum Season { Winter, Spring, Summer, Autumn };
фактически эквивалентно следующему:
enum Season { Winter=0, Spring=1, Summer=2, Autumn=3 };
Хотя мы можем явным образом переопределить эти значения. Так, мы можем задать значение одной константы, тогда значения следующих констант будет увеличиваться на единицу:
enum Season { Winter=5, Spring, Summer, Autumn }; // 5, 6, 7, 8
Либо можно каждой константе задать свое значение:
enum Season { Winter=4, Spring=8, Summer=16, Autumn=32 }; // 4, 8, 16, 32
Также мы можем получить непосредственно текстовое значение:
enum Season { Winter=0, Spring=1, Summer=2, Autumn=3 }; var current: string = Season[2]; // 2 - числовое значение Summer console.log(current); // Summer
Кроме числовых перечислений в TypeScript есть строковые перечисления, константы которых принимают строковые значения:
enum Season { Winter = "Зима", Spring = "Весна", Summer = "Лето", Autumn = "Осень" }; var current: Season = Season.Summer; console.log(current); // Лето
Также можно определять смешанные перечисления, константы которых могут числа и строки.
enum Season { Winter = 1, Spring = "Весна", Summer = 3, Autumn = "Осень" }; var current: Season = Season.Summer; console.log(current); // 3 console.log(Season.Autumn); // Осень
Перечисление может выступать в качестве параметра функции.
enum DayTime { Morning, Evening }; function welcome(dayTime: DayTime){ if(dayTime === DayTime.Morning){ console.log("Доброе утро"); } else{ console.log("Добрый вечер"); } } let current: DayTime = DayTime.Morning; welcome(current); // Доброе утро welcome(DayTime.Evening); // Добрый вечер
Каждая константа перечисления описывает некоторое состояние. И функция welcome()
в виде параметра dayTime принимает это состояние и в зависимости
от полученного значения выводит на консоль определенное значение.
Однако стоит отметить, что поскольку здесь перечисление DayTime представляет числовое перечисление, то в реальности в функцию welcome()
мы можем
передать числовые значения:
welcome(1); // Добрый вечер
Либо даже определить параметр функции как числовой и передавать константы числового перечисления:
enum DayTime { Morning, Evening }; function welcome(dayTime: number){ if(dayTime === DayTime.Morning){ console.log("Доброе утро"); } else{ console.log("Добрый вечер"); } } let current: DayTime = DayTime.Morning; welcome(current); // Доброе утро welcome(DayTime.Evening); // Добрый вечер
Пример параметра-строкового перечисления:
enum DayTimeMessage { Morning = "Доброе утро", Evening = "Добрый вечер" }; function welcome(message: DayTimeMessage){ console.log(message); } let mes: DayTimeMessage = DayTimeMessage.Morning; welcome(mes); // Доброе утро welcome(DayTimeMessage.Evening); // Добрый вечер
При использовании строковых перечислений в отличие от числовых мы не можем передать переметру произвольную строку:
welcome("Привет, ты спишь?")
В этом случе компилятор выкатит нам ошибку при компиляции.
В то же время если параметр представляет тип string
, то такому параметру можно передавать как строки, так и константы строкового перечисления:
enum DayTimeMessage { Morning = "Доброе утро", Evening = "Добрый вечер" }; function welcome(message: string){ console.log(message); } let mes: DayTimeMessage = DayTimeMessage.Morning; welcome(mes); // Доброе утро welcome(DayTimeMessage.Evening); // Добрый вечер