Пошук уроків, статей та іншого контенту
Два способи описати фіксований набір значень — і чому union літералів часто практичніший за enum.
enum Status {
Active,
Inactive,
Banned,
}
let current: Status = Status.Active;За замовчуванням числовий enum — кожен варіант відповідає послідовному числу (Active = 0, Inactive = 1, Banned = 2). String enum явно задає рядкове значення кожному варіанту, що зазвичай зручніше для налагодження (console.log покаже осмислене значення, а не 0):
enum Status {
Active = "ACTIVE",
Inactive = "INACTIVE",
Banned = "BANNED",
}Той самий результат — обмежений, фіксований набір допустимих значень — можна отримати без enum узагалі, просто union рядкових літералів, уже знайомим із попередніх уроків цього курсу:
type Status = "ACTIVE" | "INACTIVE" | "BANNED";
let current: Status = "ACTIVE";enum — окрема мовна конструкція TypeScript (не стандартний JavaScript), що генерує додатковий JavaScript-код під час компіляції; union літералів компілюється в звичайні рядки без жодного додаткового рантайм-коду.
Значення union літералів ("ACTIVE") видно одразу в самому коді й у відповіді API без додаткового мапінгу; числовий enum за замовчуванням показує лише число, незрозуміле без звернення до визначення enum.
union легко комбінується з рештою системи типів (звуження, discriminated unions з попереднього модуля) без додаткових особливостей поведінки, специфічних для enum.
as const каже компілятору вивести якомога вужчий, літеральний тип значення, а не загальний (наприклад, конкретний масив рядкових літералів замість просто string[]) — корисно для отримання union-типу з масиву значень, які й так потрібні в рантаймі:
const STATUSES = ["ACTIVE", "INACTIVE", "BANNED"] as const;
type Status = (typeof STATUSES)[number]; // "ACTIVE" | "INACTIVE" | "BANNED" — виведено з масиву
// STATUSES доступний і в рантаймі (наприклад, для .map() у випадаючому списку),
// і Status як тип — з одного й того самого джерела правди, без дублюванняВикористовувати числовий enum там, де важлива читабельність значення в даних чи логах, — стандартне число незрозуміле без звернення до визначення enum.
Дублювати той самий набір допустимих значень окремо як union-тип і окремо як масив для рантайм-використання (наприклад, для .map() у списку опцій) — as const із наступним індексованим доступом дає обидва з одного джерела.
Автоматично тягнутись до enum за звичкою з інших мов програмування, не розглянувши union літералів як простішу, більш «в дусі TypeScript» альтернативу для більшості практичних випадків.
enum описує іменований, фіксований набір значень, але генерує додатковий JavaScript-код і за замовчуванням менш читабельний (числові значення); union рядкових літералів часто практичніший — простіший, без рантайм-накладних витрат, легко комбінується з рештою системи типів. as const дозволяє вивести union-тип напряму з масиву значень, потрібних і в рантаймі, уникаючи дублювання одного джерела правди в двох місцях.