Table of Contents #

Перечисления #

Перечисления позволяют определить набор именованных числовых констант. Они определяются используя ключевое слово enum.

enum Direction {
    Up = 1,
    Down,
    Left,
    Right
}




Тело перечисления состоит из нуля или более элементов. Элементы перечисления имеют численное значение ассоциированное с именем, и могут быть либо константой, либо могут быть вычислены. Элемент перечисления считается константой, если:

Во всех остальных случаях считается, что элемент перечисления вычисляем.

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
}

Одно важное отличие между окружающим и не окружающим перечислениями в том, что в обычных перечислениях элементы, не имеющие инициализатора, считаются константными элементами. Для элемента не константного окружающего перечисления, не имеющего инициализатора, элемент считается вычисляемым.

Источник







Поддержите перевод документации:



Поддерживатель | Github Репозиторий


Documentation generated by mdoc.
Молния! Обновления, новости и статьи Typescript.