TypeScript. Enums (перечисления)

Enum позволяет создать набор числовых значений с собственным именем у каждого элемента. Создаются перечисления с использованием ключевого слова enum. В теле перечисления может содержаться ноль и больше элементов:

enum Directions {
    North = 1,
    South, // 2
    West = 777,
    East // 778
}

let direction: Directions = Directions.South;

console.log(direction); // 2
console.log(Directions[direction]); // South

move(direction);

Числовые значения для элементов перечисления создаются автоматически по порядку, начиная с нуля. Но можно задать начальное, некоторые или все значения самостоятельно. Приведенное выше перечисление будет транспилировано в следующий JavaScript код:

var Directions;
(function (Directions) {
    Directions[Directions["North"] = 1] = "North";
    Directions[Directions["South"] = 2] = "South";
    Directions[Directions["West"] = 777] = "West";
    Directions[Directions["East"] = 778] = "East"; 
})(Directions || (Directions = {}));

Перечисление представляет собой объект, в котором хранится как прямое отображение "ключ-значение", так и обратное "значение-ключ".

Можно добиться уменьшения транспилированного JS кода, если использовать константные перечисления. Для этого перед enum нужно написать const:

const enum Directions {
    North,
    South, 
    West,
    East
}

let direction: Directions = Directions.South;

Этот код будет транспилирован в JS как:

var direction = 1 /* South */;

Т.е. в процессе компиляции выполнится замена элементов перечислений на их константные значения. Но тут есть обратная сторона. Использовать обращения к перечислению с целью получить значение по ключу не выйдет, ибо объект-перечисление в памяти не находится:

console.log(Directions[direction]); // Ошибка!

Элемент константного перечисления доступен только с использованием строкового литерала.