Výčtový typ TypeScript je praktický způsob, jak sbalit související hodnoty s jasným významem.

Výčet nebo výčtový typ je datová struktura, která umožňuje definovat sadu pojmenovaných hodnot.

Výčty poskytují způsob, jak reprezentovat pevnou sadu hodnot jako konstanty. Mohou pomoci učinit váš kód expresívnějším a samostatnějším dokumentováním tím, že konkrétním hodnotám dají smysluplné názvy. Zde se dozvíte, jak můžete používat výčty v TypeScriptu.

Vytvoření Enum

Výčty obecně představují pevný počet možností pro danou hodnotu. Například výčet představující primární barvy může mít pevné hodnoty pro červenou, žlutou a modrou.

Výčty představují data jako sadu párů klíč/hodnota známých jako členové výčtu. Klíč musí být vždy řetězec. Hodnota – ve výchozím nastavení automaticky narůstající číslo – však může být číselná, řetězcová nebo vypočítaná.

Můžete vytvořit výčet v jazyk TypeScript za použití enum klíčové slovo. Následujte za ním jméno výčtu a pár složených závorek ({}) obsahující členy výčtu. Běžná konvence pojmenování JavaScriptu uvádí, že názvy výčtů by měly začínat velkým písmenem.

enum Směr {
Nahoru,
Dolů,
Vlevo, odjet,
Že jo
}

Tento příklad obsahuje výčet nazvaný Směr. Výčet má člen reprezentující každý směr: nahoru, dolů, doleva a doprava.

Protože tento kód neurčuje hodnotu pro každý z klíčů, TypeScript automaticky přiřadí hodnoty. První člen, Up, bude mít hodnotu 0. Zbývající členové budou mít hodnotu o 1 větší než předchozí člen. Můžete to výslovně deklarovat, pokud je pro vás obtížné si zapamatovat:

enum Směr {
Nahoru = 0,
Dolů = 1,
Vlevo = 2,
Správně = 3,
}

Nebo můžete explicitně deklarovat jiné hodnoty a ponechat nedeklarované hodnoty, aby se nadále zvětšovaly jako dříve:

enum Stav {
Aktivní = 9,
Neaktivní, // 10
}

V tomto příkladu má neaktivní člen hodnotu 10. Toto chování se týká výčtů, které mají pouze číselné hodnoty, nikoli výčtů s řetězci nebo heterogenními členy.

Různé typy Enum

Výčty v TypeScriptu mají implicitní typ, který je založen na typu hodnot, které jejich členové drží. Nejběžnějším typem je číselný výčet, jehož chování pokrývá předchozí část, ale existují dvě varianty.

Výčty řetězců

Řetězcový výčet je výčet, ve kterém jsou všechny jeho členy řetězce. Na rozdíl od číselných výčtů, kde se hodnoty přiřazují automaticky, musíte každý člen inicializovat pomocí řetězce:

enum Primární barvy {
Červená = "ČERVENÉ",
Žlutá = "ŽLUTÁ",
Modrá = "MODRÝ"
}

Přestože výčty řetězců nemají vlastnosti automatického zvyšování, mohou mít větší smysl, pokud je serializujete. Jejich hodnoty by měly být stále popisné, bez názvů členů, zatímco sada číselných hodnot nemusí být sama o sobě popisná.

Heterogenní výčty

Heterogenní výčty jsou výčty, které obsahují jak číselné, tak řetězcové členy. Například:

enum Výsledek {
Úspěch = "ÚSPĚCH",
Selhání = 0
}

Heterogenní výčty jsou užitečné, když máte členy výčtu, které vyžadují různé typy hodnot na základě specifického kontextu nebo významu každého člena. Nicméně, Dokumentace TypeScript odrazuje od používání heterogenních výčtů, protože zavádějí složitost, která může způsobit, že váš kód bude náchylnější k chybám.

Vypočítaný a konstantní počet členů

Každý člen výčtu má hodnotu, která může být konstantní nebo vypočítaná.

Konstantní výčet členů

Člen enum je konstantní, pokud splňuje některou z níže uvedených podmínek.

  1. Je to první člen výčtu a nemá žádný inicializátor.
  2. Nemá inicializátor a předchozí člen výčtu byl číselnou konstantou.
  3. Inicializuje se konstantním výrazem enum.

Podle dokumentace TypeScript je výraz konstantního výčtu podmnožinou výrazů TypeScript, které lze plně vyhodnotit v době kompilace. Například řetězec nebo číselný literál.

Například členové výčtů v níže uvedeném bloku kódu jsou konstantní:

// PŘÍPAD 1
enum Směr {
Nahoru,
Dolů,
Vlevo, odjet,
Že jo
}

// PŘÍPAD 2
enum všední den {
pondělí = 1,
Úterý,
Středa,
Čtvrtek,
pátek
}

// PŘÍPAD 3
enum Sezóna {
Jaro = "JARO",
Léto = "LÉTO",
Podzim = "PODZIM",
Zima = "ZIMA"
}

Když transpilujete členy konstantního výčtu do prostého JavaScriptu, vygenerovaný kód použije jejich doslovné hodnoty. To může být přínosné pro výkon a usnadnit ladění.

Zde je například přeložená verze seznamu sezón:

var Sezóna;
(funkce (Sezóna) {
Sezóna["Jaro"] = "JARO";
Sezóna["Léto"] = "LÉTO";
Sezóna["Podzim"] = "PODZIM";
Sezóna["Zima"] = "ZIMA";
})(Sezóna || (Sezóna = {}));

Vypočítaný výčet členů

Vypočítané členy výčtu můžete použít k přiřazení hodnot členům výčtu na základě výrazů nebo jiných dynamických výpočtů. Například:

enum Velikost {
Malý = 1,
Střední = vypočítatVelikost(12),
Velké = vypočítatVelikost(5)
}

funkcevypočítatVelikost(hodnota: číslo): číslo{
vrátit se hodnota * 5;
}

řídicí panel.log (velikost. Velký)

The Velikost enum má tři členy: Malý, Střední, a Velký. Explicitně přiřadí hodnotu 1 malému členu. The Střední a Velký členové používají funkci vypočítatVelikost pro výpočet jejich hodnot za běhu.

Při práci s vypočítanými členy výčtu je důležité si uvědomit, že hodnoty nejsou známy až do běhu. To může přinést větší složitost a potenciál runtime chyby ve srovnání s členy výčtu s konstantními hodnotami.

Například:

var Velikost;
(funkce (Velikost) {
Velikost[Velikost["Malý"] = 1] = "Malý";
Velikost[Velikost["Střední"] = vypočítatVelikost(12)] = "Střední";
Velikost[Velikost["Velký"] = vypočítatVelikost(5)] = "Velký";
})(Velikost || (Velikost = {}));

řídicí panel.log(Velikost.Velký)

Blok kódu výše je transpilovaná verze souboru Velikost enum. Všimněte si, že TypeScript nezahrnuje vrácené hodnoty z countSize() do kódu JavaScript. Místo toho obsahuje původní volání funkce, takže JavaScript určuje hodnoty za běhu.

Přístup k hodnotám výčtu

K hodnotám členů výčtu můžete přistupovat pomocí tečkové notace objektu.

Například:

enum Směr {
Nahoru = 0,
Dolů = 1,
Vlevo = 2,
Správně = 3,
}

řídicí panel.log (Směr. Vlevo, odjet) // 2

Číselné výčty zpětného mapování

Reverzní mapování v číselných výčtech odkazuje na schopnost načíst odpovídající název člena výčtu z jeho hodnoty. To může být užitečné zejména při práci s číselnými hodnotami, které možná budete muset dekódovat.

Ve výchozím nastavení jsou hodnoty výčtu v TypeScriptu mapovány dopředu, což znamená, že máte přístup pouze k hodnotě přidružené k názvu. Můžete však ručně provést zpětné mapování a načíst člen výčtu na základě jeho hodnoty.

Například:

enum Směr {
Nahoru = 1,
Dolů,
Vlevo, odjet,
Že jo
}

funkcegetDirectionName(directionValue: číslo): tětiva{
// Obrácené mapování
konst directionName = Direction[directionValue];
vrátit se directionName;
}

řídicí panel.log (getDirectionName(1)); // "Nahoru"
řídicí panel.log (getDirectionName(3)); // "Vlevo, odjet"

Tento getDirectionName Funkce provádí zpětné mapování přístupem ke jménu člena výčtu pomocí jeho hodnoty jako indexu. Funkce trvá a directionValue jako argument a získá odpovídající jméno člena výčtu pomocí Směr[directionValue].

Zpětné mapování může být užitečné ve scénářích, kde máte číselnou hodnotu a potřebujete určit odpovídající jméno člena výčtu. Poskytuje pohodlný způsob práce s výčty v dopředném i zpětném směru.

Existuje mnoho aplikací výčtů

Výčty můžete použít v různých scénářích, jako je zpracování příkazů přepínače, definování parametrů funkcí, mapování dat a reprezentace voleb nebo nastavení.

Ať už potřebujete reprezentovat konečnou množinu možností nebo spravovat složité přechody stavů, výčty v TypeScriptu jsou cenným nástrojem pro zlepšení jasnosti a struktury vašeho kódu.