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 vesnici

switch 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ý lektvar

Chybě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ých

V 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í.

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

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

2/8