Перечисления
Перечисление - это способ организации коллекции связанных переменных. Многие языки программирования (такие как С / С# / Java) имеют тип данных enum
. Вот как определить тип перечисления в TypeScript:
Эти значения перечислений являются number
, поэтому я буду называть их числовыми перечислениями.
Числовые перечисления и числа
Перечисления TypeScript основаны на числах. Это означает, что числа могут быть назначены экземпляру перечисления, как и все, что совместимо с числом.
Числовые перечисления и строки
Прежде чем мы углубимся в перечисления, давайте рассмотрим генерируемый им JavaScript, вот пример TypeScript:
Скомпилированный JavaScript:
давайте сосредоточимся на строке Tristate [Tristate['False'] = 0] = 'False' ;
. Внутри него Tristate ['False'] = 0
должен быть самоочевидным, т. e. присваивает элементу False
переменной Tristate
значение 0
. Обратите внимание, что в JavaScript оператор присваивания возвращает назначенное значение (в данном случае 0
). Поэтому следующая вещь, выполняемая средой выполнения JavaScript, это Tristate[0] = 'False'
. Это означает, что вы можете использовать переменную Tristate
для преобразования строковой версии перечисления в число или числовую версию перечисления в строку. Это продемонстрировано ниже:
Изменить число, связанное с числовым перечислением
По умолчанию первое значение перечисления равно 0
, а каждое последующее значение увеличивается на единицу:
Однако вы можете изменить число, связанное с любым членом перечисления, с помощью специального назначения. Для следующего примера мы увеличиваем с 3:
Числовые перечисления как флаги
Одним из превосходных применений перечислений является возможность использовать перечисления в качестве флагов. Флаги позволяют вам проверить, верно ли определенное условие из набора условий. Рассмотрим следующий пример, где у нас есть набор свойств о животных:
Здесь мы используем оператор побитового сдвига влево, чтобы сдвинуть двоичную позицию числа 1
влево, и получить числа 0001
, 0010
, 0100
и 1000
(в десятичных терминах: 1, 2, 4, 8). Когда вы используете этот флаг, ваши битовые операторы |
(или), &
(и), ~
(нет) не при работе с флагами:
Здесь:
Мы использовали
|=
, чтобы добавить флаги;комбинацию
&=
и~
, чтобы убрать флаг;|
объединить флаги.
Перечисления строк
Мы смотрели только на перечисления, где значения членов являются числами. На самом деле вам также разрешено иметь члены перечисления со строковыми значениями. Например:
С ними проще работать и дебажить, так как они предоставляют понятные строковые значения.
Вы можете использовать эти значения для простого сравнения строк. Например:
Постоянное перечисление
Строка const lie = Tristate.False
скомпилируется в const lie = Tristate.False
(да, выходные данные совпадают с входными данными). Это означает, что во время выполнения необходимо будет выполнить поиск Tristate
, а затем Tristate.False
. Для повышения производительности вы можете пометить перечисление как постоянное перечисление(const enum
). Это продемонстрировано ниже:
Будет скомпилировано в:
Компилятор будет:
Любое использование встроенных перечислений (
0
вместоTristate.False
);Не генерирует JavaScript для определения enum (во время выполнения отсутствует переменная
Tristate
), поскольку его использование встроено.
Опция preserveConstEnums
preserveConstEnums
Встраивание имеет очевидные преимущества в производительности. Тот факт, что во время выполнения отсутствует переменная Tristate
, просто помогает компилятору, не генерировать JavaScript, который фактически не используется во время выполнения. Однако вы, возможно, захотите, чтобы компилятор по-прежнему генерировал JavaScript-версию определения перечисления для таких вещей, как получения числа через строку или поиск строки через число, как мы видели. В этом случае вы можете использовать флаг компилятора --preserveConstEnums
, и он все равно сгенерирует определение var Tristate
, так что вы можете использовать Tristate['False']
или Tristate[0]
вручную во время выполнения, если хотите. Это никак не влияет на врезку.
Перечисление со статическими методами
Вы можете добавить статические методы к типам enum
, используя объявление enum
+ namespace
. Как показано в следующем примере, мы добавляем статический метод isBusinessDay
в перечисление:
Перечисления открыты для добавления
Давайте еще раз посмотрим, как выглядит перечисление, скомпилированное в JavaScript:
Мы объяснили что Tristate [Tristate ['False'] = 0] = 'False'
, теперь давайте посмотрим на функцию-оболочку (function (Tristate) {/ код здесь /}) (Tristate || (Tristate = { }))
, Особенно на часть (Tristate || (Tristate = {}))
. Он захватывает локальную переменную Tristate
, которая либо указывает на уже существующее значение Tristate
, либо инициализирует его новым пустым объектом.
Это означает, что вы можете разделить (и расширить) определение перечисления на несколько файлов, как показано ниже, вы можете разделить определение Color
на два блока:
Last updated
Was this helpful?