switch podle druhu
Když má sjednocení víc než dva druhy, řetězy if a else if se prodlužují. JavaScript má pro výběr podle jedné hodnoty zvláštní příkaz: switch (anglicky „přepnout“). Je pro vás nový, a tak si ho nejdřív prohlédněte na sjednocení literálů se světovými stranami:
type Smer = "sever" | "jih" | "vychod" | "zapad";
function jdi(smer: Smer): void {
switch (smer) {
case "sever":
console.log("Jdete do hor");
break;
case "vychod":
console.log("Jdete k moři");
break;
default:
console.log("Zůstáváte ve vesnici");
break;
}
}
jdi("vychod");
jdi("zapad");Vypíše:
Jdete k moři
Zůstáváte ve vesniciswitch vezme hodnotu v závorkách, tady smer, a porovná ji pomocí === s hodnotou za každým case („případ“). Skočí na první case, který se shoduje, a provede příkazy pod ním. break („přerušit“) příkaz switch ukončí: program pokračuje za jeho uzavírací složenou závorkou. default („výchozí“) zachytí všechny hodnoty, které nemají vlastní case, stejně jako else na konci řetězu if. Je nepovinný a obvykle se píše jako poslední.
Na break si dejte pozor. Bez něj se program u dalšího case nezastaví: propadne dál a provede i příkazy následujících případů, dokud nenarazí na break nebo na konec příkazu switch. S předměty z minulého cvičení:
function pouzijPredmet(predmet: Predmet): void {
switch (predmet.druh) {
case "lektvar":
console.log(`Vypijete: ${predmet.nazev}`);
case "zbran":
console.log(`Tasíte: ${predmet.nazev}`);
break;
}
}
pouzijPredmet({ druh: "lektvar", nazev: "Léčivý lektvar", leceni: 20 });Vypíše:
Vypijete: Léčivý lektvar
Tasíte: Léčivý lektvarChybějící break TypeScript neohlásí, takže když switch dělá víc, než má, hledejte právě ten.
Ve funkci ukončí switch i return (ukončí totiž celou funkci), a tak case, který vrací hodnotu, žádný break nepotřebuje. A u rozlišeného sjednocení každý case typ zúží, stejně jako if:
function cena(predmet: Predmet): number {
switch (predmet.druh) {
case "lektvar":
return predmet.leceni * 2;
case "zbran":
return predmet.poskozeni * 5;
}
}
for (const predmet of inventar) {
console.log(`${predmet.nazev}: ${cena(predmet)} zlatých`);
}S inventářem z minulého cvičení vypíše:
Léčivý lektvar: 40 zlatých
Stříbrný meč: 60 zlatýchV case "lektvar": je předmět typu Lektvar, takže predmet.leceni je dovolené; predmet.poskozeni by tam skončilo chybou error TS2339: Property 'poskozeni' does not exist on type 'Lektvar'. Všimněte si také, že za příkazem switch žádný return není, a TypeScriptu to nevadí: ví, že oba případy pokrývají všechny druhy předmětů. Víc o tom v dalším cvičení.
TypeScript kontroluje i hodnoty za case. S překlepem:
type Lektvar = { druh: "lektvar"; nazev: string; leceni: number };
type Zbran = { druh: "zbran"; nazev: string; poskozeni: number };
type Predmet = Lektvar | Zbran;
function pouzijPredmet(predmet: Predmet): void {
switch (predmet.druh) {
case "lektvr":
console.log(`Vypijete: ${predmet.nazev}`);
break;
case "zbran":
console.log(`Tasíte: ${predmet.nazev}`);
break;
}
}main.ts(7,14): error TS2678: Type '"lektvr"' is not comparable to type '"lektvar" | "zbran"'.
main.ts(8,46): error TS2339: Property 'nazev' does not exist on type 'never'.První chyba říká, že "lektvr" nemůže být druh předmětu. Druhá je jejím důsledkem: ve větvi case, která nikdy nemůže nastat, má předmět typ never, tedy typ hodnoty, která nemůže existovat. S typem never se znovu setkáte v dalším cvičení.
Jak psát:
Pokyny
Přepište popisPredmetu pomocí switch (predmet.druh), s jedním case pro každý druh, který vrátí jeho popis. Program vypíše stejné dva řádky jako předtím.
Kira našla klíč. Přidejte do sjednocení Predmet třetí druh předmětu, type Klic = { druh: "klic"; nazev: string; otevira: string };, přidejte pro něj do příkazu switch nový case a na konec inventáře přidejte { druh: "klic", nazev: "Starý klíč", otevira: "kryptu" }. Program pak vypíše:
Léčivý lektvar (léčí 20)
Stříbrný meč (poškození 12)
Starý klíč (otevírá kryptu)Začněte programovat zdarma
2/8