Оглавление:
Карта сайта:
Оглавление:
Карта сайта:
Перечисления позволяют определить набор именованных числовых констант. Они определяются используя ключевое слово enum.
enum Direction { Up = 1, Down, Left, Right }
Тело перечисления состоит из нуля или более элементов. Элементы перечисления имеют численное значение ассоциированное с именем, и могут быть либо константой, либо могут быть вычислены. Элемент перечисления считается константой, если:
0.+, -, ~, применённым к константному выражению перечисления+, -, *, /, %, «, », »>, &, |, ^ с константным выражением перечисления как операнд. Константное выражение перечисления, вычисляемое в NaN или Infinity, приводит к ошибке во время компиляцииВо всех остальных случаях считается, что элемент перечисления вычисляем.
enum FileAccess { // константные элементы None, Read = 1 << 1, Write = 1 << 2, ReadWrite = Read | Write, // вычисляемые элементы G = "123".length }
Перечисления - это действительные объекты, существующие во время выполнения. Одной из причин этого является способность поддерживать обратное отображение из значений перечисления к именам перечисления.
enum Enum { A } let a = Enum.A; let nameOfA = Enum[Enum.A]; // "A"
компилируется в:
var Enum; (function (Enum) { Enum[Enum["A"] = 0] = "A"; })(Enum || (Enum = {})); var a = Enum.A; var nameOfA = Enum[Enum.A]; // "A"
В сгенерированном коде перечисление скомпилировано в объект, который хранит прямое (имя → значение) и обратное (значение → имя) отображения. Ссылки к элементам перечисления всегда выполняются как доступы к свойству и никогда не встраиваются. Во многих случаях это является правильным решением. Однако, иногда требования жёстче. Чтобы избежать оплаты стоимости дополнительного сгенерированного кода и косвенного обращения при получении доступа к значениям перечисления можно использовать константные перечисления. Константые перечисления определяются используя модификатор const, предшествующий ключевому слову enum.
const enum Enum { A = 1, B = A * 2 }
Константные перечисления могут только использовать константные выражения перечисления, и в отличие обычных перечислений они полностью удаляются в течение компиляции. Элементы константного перечисления встраиваются в местах использования. Это возможно, поскольку константные перечисления не могут иметь вычисляемых элементов.
const enum Directions { Up, Down, Left, Right } let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right]
в сгенерированном коде превратится в
var directions = [0 /* Up */, 1 /* Down */, 2 /* Left */, 3 /* Right */];
Окружающие перечисления используются для описания формы уже существующих перечислений.
declare enum Enum { A = 1, B, C = 2 }
Одно важное отличие между окружающим и не окружающим перечислениями в том, что в обычных перечислениях элементы, не имеющие инициализатора, считаются константными элементами. Для элемента не константного окружающего перечисления, не имеющего инициализатора, элемент считается вычисляемым.