Название фичи: Enums(Перечисления)
Описание:
Перечисления - это действительные объекты, существующие во время выполнения, которые позволяют определить набор именованных числовых констант.
Аналог в c# / js: Enumerable
Детали:
Тело перечисления состоит из нуля или более элементов. Элементы имеют численное значение ассоциированное с именем, которое может быть константой / вычислено.
Элемент считается константой, если:
- Отсутствие инициализатора, а предшествующий элемент перечисления был константой (значение будет равняться значению предшествующего элемента перечисления плюс единица. Исключение - первый элемент перечисления)
- Инициализирован с константным выражением перечисления (то есть, с подмножеством TS выражений, которое может быть полностью вычислено во время компиляции: численным литералом; константным выражением перечисления, взятым в круглые скобки; унарным / бинарным оператором; ссылка к прежде определённому константному элементу перечисления)
В остальных случаях, считается, что элемент вычисляем.
Разновидности перечислений:
- Обычные перечисления
- Константные перечисления - используют только константные выражения перечисления, и в отличие от обычных полностью удаляются в течение компиляции. Элементы встраиваются в местах использования.
- Окружающие перечисления - используются для описания формы уже существующих перечислений, отличаются тем, что для элемента не константного окружающего перечисления, у которого нет инициализатора, элемент считается вычисляемым (не константным).
Перечисления совместимы с числами, и наоборот. Значения из различных перечислений считаются несовместимыми друг с другом.
Решаемая проблема:СМ Конспект
Пример возникновения:
При создании парсера, который перебирает каждый символ строки , необходимо сравнить текущий символ с чем-либо. В JavaScript разработчику пришлось бы инициализировать целый список переменных.
Как решить проблему:
Используя enum
разработчику становятся доступными конструкции вида:
if (node.type === NodeType.OpenParetheses) {...}
Простое и прозрачное использование типов, которые подвергаются строгой проверке компилятором.
Синтаксис:
enum Color {
Red = 1,
Green = 2,
Blue = 4
};
let c: Color = Color.Green;
//совместимость типов
enum Status { Ready, Waiting };
enum Color { Red, Blue, Green };
let status = Status.Ready;
status = Color.Green; // ошибка несовместимости перечислений
Перекомпилированный в JS код:
var Color;
(function (Color) {
Color[Color["Red"] = 1] = "Red";
Color[Color["Green"] = 2] = "Green";
Color[Color["Blue"] = 4] = "Blue";
})(Color || (Color = {}));
var c = Color.Green;
var Status;
(function (Status) {
Status[Status["Ready"] = 0] = "Ready";
Status[Status["Waiting"] = 1] = "Waiting";
})(Status || (Status = {}));
;
var Color;
(function (Color) {
Color[Color["Red"] = 0] = "Red";
Color[Color["Blue"] = 1] = "Blue";
Color[Color["Green"] = 2] = "Green";
})(Color || (Color = {}));
;
var status = Status.Ready;
status = Color.Green;