Enums

Enums

Перелік.

Перелік (Enums) — це спосіб організувати колекцію пов’язаних значень. Багато інших мов програмування (C/C#/Java) мають тип даних enum , але JavaScript його не має. Однак TypeScript його має. Ось приклад визначення переліку TypeScript:

enum CardSuit {
	Clubs,
	Diamonds,
	Hearts,
	Spades
}

// Зразок використання
var card = CardSuit.Clubs;

// Безпека
card = "not a member of card suit"; // Помилка: рядок не можна призначити типу `CardSuit`

Ці значення переліків є 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:

тобто компілятор:

  1. Використовує при будь-якому зверненню до переліку 0 замість Tristate.False.

  2. Не створює 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