Enums
Enums
Перелік.
Перелік (Enums) — це спосіб організувати колекцію пов’язаних значень. Багато інших мов програмування (C/C#/Java) мають тип даних enum
, але JavaScript його не має. Однак TypeScript його має. Ось приклад визначення переліку TypeScript:
Ці значення переліків є number
, тому відтепер я буду називати їх Числовим Переліком
Number Enums and Numbers
Числові Перелікі і числа
Переліки TypeScript базуються на числах. Це означає, що числа можна призначити екземпляру enum, а також будь-що інше, сумісне з number
Number Enums and Strings
Числові Переліки і рядки
Перш ніж ми подивимося далі на enum, давайте подивимося на JavaScript, який він генерує, ось зразок TypeScript:
генерує такий JavaScript:
зосередимося на рядку Tristate[Tristate["False"] = 0] = "False";
. У ньому Tristate["False"] = 0
має бути зрозумілим, тобто встановлює значення "False" для змінної Tristate рівним 0 . Зверніть увагу, що в JavaScript оператор присвоєння повертає присвоєне значення (у цьому випадку 0 ). Тому наступним, що виконується середою виконання JavaScript, є Tristate[0] = "False"
. Це означає, що ви можете використовувати змінну Tristate для перетворення рядкової версії enum у число або числової версії enum у рядок. Це показано нижче:
Changing the number associated with a Number Enum
Зміна числа, пов’язаного з Числовим Переліком
За замовчуванням переліки починаються з 0
, а потім кожне наступне значення автоматично збільшується на 1. Як приклад розглянемо наступне:
Однак ви можете змінити номер, пов’язаний з будь-яким членом переліку, спеціально призначивши його. Це показано нижче, де ми починаємо з 3 і починаємо збільшувати звідти:
ПОРАДА: я досить часто ініціалізую перший перелік за допомогою
= 1
, оскільки це дає мені змогу безпечно перевірити правдивість значення enum.
Number Enums as flags
Числові Переліки як прапори
Одним із чудових способів використання переліків є можливість використовувати переліки як прапори (Flags
). Flags
дозволяють перевірити, чи виконується певна умова з набору умов. Розглянемо наступний приклад, де ми маємо набір властивостей тварин:
Тут ми використовуємо оператор зсуву вліво, щоб перемістити 1
на певний рівень бітів, щоб отримати побітово непересічні числа 0001 , 0010 , 0100 і 1000
(це десяткові числа 1 , 2 , 4 , 8 ,
якщо вам цікаво). Побітові оператори |
(або) /
&
(та) /
~
(не) є вашими найкращими друзями під час роботи з прапорцями, які показано нижче:
У цьому прикладі:
ми використали
|=
для додавання прапорівкомбінація
&=
і~
для зняття прапора|
поєднувати прапори
Примітка: ви можете комбінувати прапорці для створення зручних ярликів у визначенні enum, наприклад
EndangeredFlyingClawedFishEating
нижче:
String Enums
Строкові переліки
Ми розглядали лише переліки, де значеннями членів є number
. Вам також дозволено мати члени enum із строковим значеннями. Наприклад:
З ними легше працювати та налагоджувати, оскільки вони надають значущі рядкові значення, які легше перевіряти. Ці значення можна використовувати для простого порівняння рядків.
Const Enums
Константні Переліки.
Якщо у вас є таке визначення переліку
то рядок var lie = Tristate.False
скомпільовано до JavaScript var lie = Tristate.False
(так, вихідні дані такі ж, як і вхідні). Це означає, що під час виконання буде потрібно знайти Tristate
, а потім Tristate.False
. Щоб підвищити продуктивність, ви можете позначити enum як const enum
. Це показано нижче:
генерує JavaScript:
тобто компілятор:
Використовує при будь-якому зверненню до переліку
0
замістьTristate.False
.Не створює JavaScript для визначення переліку (немає змінної
Tristate
під час виконання), оскільки його використання вбудовано.
Const enum preserveConstEnums
Вбудовування має очевидні переваги продуктивності. Той факт, що під час виконання не існує змінної Tristate
, просто компілятор допомагає вам, не генеруючи JavaScript, який насправді не використовується під час виконання. Однак ви можете захотіти, щоб компілятор усе ще генерував версію визначення enum у JavaScript для таких речей, як пошук number to string or string to number , як ми бачили. У цьому випадку ви можете використати прапорець компілятора --preserveConstEnums
, і він усе одно генеруватиме визначення var Tristate , щоб ви могли використовувати Tristate["False"]
або Tristate[0]
вручну під час виконання, якщо хочете. Це жодним чином не впливає на вбудовування .
Enum with static functions
Enum зі статичними функціями
Ви можете використовувати оголошення enum
+ namespace
, щоб додати статичні методи до enum. Нижче наведено приклад, коли ми додаємо статичний членisBusinessDay
до переліку Weekday
:
Enums are open ended
Enum є відкритими для додавання.
ПРИМІТКА: відкриті перерахування актуальні, лише якщо ви не використовуєте модулі. Але Ви повинні використовувати модулі. Тому цей розділ останній.
Ось згенерований JavaScript для переліку, показаного знову:
Ми вже пояснювали частину Tristate[Tristate["False"] = 0] = "False
. Тепер зверніть увагу на навколишній код (функція (Tristate) { /*код тут*/ })(Tristate || (Tristate = {}))
; зокрема (Tristate || (Tristate = {}))
частина. По суті, це фіксує локальну змінну TriState , яка або вказуватиме на вже визначене значення Tristate , або ініціалізує його новим порожнім об’єктом {} . Це означає, що ви можете розділити (і розширити) визначення enum на кілька файлів. Наприклад, нижче ми розділили визначення кольору на два блоки
Зауважте, що вам обовʼязково повторно ініціалізувати перший член (тут DarkRed = 3
) у продовженні переліку, щоб отримати згенерований код, а не стерти значення з попереднього визначення (тобто значення 0
, 1
, ... тощо). TypeScript попередить вас, якщо ви цього не зробите (повідомлення про помилку In an enum with multiple declarations, only one declaration can omit an initializer for its first enum element.
).
Last updated