Низови enums
В TypeScript, низовият enum е Enum, при който всяка константа получава низова стойност.
enum Language { English = 'EN', Spanish = 'ES',}Забележка: TypeScript позволява използването на хетерогенни enums, където низови и числови членове могат да съществуват заедно.
Константни enums
Константният enum в TypeScript е специален вид Enum, при който всички стойности са известни още при компилирането и се вмъкват директно във всеки случай, в който се използва enum, което води до по-ефективен код.
const enum Language { English = 'EN', Spanish = 'ES',}console.log(Language.English);Ще бъде компилирано в:
console.log('EN' /* Language.English */);Забележка: константните enums имат предварително зададени стойности, като самият enum се премахва при компилация, което може да е по-ефективно в самостоятелни библиотеки, но обикновено не е желателно. Също така, константните enums не могат да имат изчисляеми членове.
Обратни съпоставки
В TypeScript, обратните съпоставки в Enums се отнасят до възможността да се извлече името на член на Enum от неговата стойност. По подразбиране членовете на Enum имат директни съпоставки от име към стойност, но обратни съпоставки могат да се създадат чрез явно задаване на стойности за всеки член. Обратните съпоставки са полезни, когато трябва да намерите член на Enum по стойността му или когато трябва да итерирате през всички членове на Enum. Обърнете внимание, че само числовите членове на Enum генерират обратни съпоставки, докато членовете на String Enum изобщо не получават генерирана обратна съпоставка.
Следният enum:
enum Grade { A = 90, B = 80, C = 70, F = 'fail',}Компилира се в:
'use strict';var Grade;(function (Grade) { Grade[(Grade['A'] = 90)] = 'A'; Grade[(Grade['B'] = 80)] = 'B'; Grade[(Grade['C'] = 70)] = 'C'; Grade['F'] = 'fail';})(Grade || (Grade = {}));Следователно, съпоставянето на стойности към ключове работи за числовите членове на enum, но не и за низовите членове на enum:
enum Grade { A = 90, B = 80, C = 70, F = 'fail',}const myGrade = Grade.A;console.log(Grade[myGrade]); // Aconsole.log(Grade[90]); // A
const failGrade = Grade.F;console.log(failGrade); // failconsole.log(Grade[failGrade]); // Element implicitly has an 'any' type because index expression is not of type 'number'.Ambient enums
Ambient enum в TypeScript е тип Enum, който е дефиниран в декларационен файл (*.d.ts) без свързана реализация. Той позволява да се дефинира набор от именовани константи, които могат да се използват по тип-безопасен начин в различни файлове, без да е необходимо да се импортират детайлите на реализацията във всеки файл.
Изчисляеми и константни членове
В TypeScript, изчисляем член е член на Enum, чиито стойност се изчислява по време на изпълнение, докато константен член е член, чиито стойност е зададена по време на компилация и не може да се промени по време на изпълнение. Изчисляемите членове са разрешени в обикновени Enums, докато константните членове са разрешени както в обикновени, така и в константни enums.
// Константни членовеenum Color { Red = 1, Green = 5, Blue = Red + Green,}console.log(Color.Blue); // 6 генерирано по време на компилация// Изчисляеми членовеenum Color { Red = 1, Green = Math.pow(2, 2), Blue = Math.floor(Math.random() * 3) + 1,}console.log(Color.Blue); // случайно число, генерирано по време на изпълнениеEnums се означават чрез unions, съставени от типовете на техните членове. Стойностите на всеки член могат да се определят чрез константни или неконстантни изрази, като членовете с константни стойности се присвояват на литерални типове. За илюстрация, разгледайте декларацията на type E и неговите подтипове E.A, E.B и E.C. В този случай E представлява union E.A | E.B | E.C.
const identity = (value: number) => value;
enum E { A = 2 * 5, // Числов литерал B = 'bar', // Низов литерал C = identity(42), // Изчисляем член}
console.log(E.C); //42