Úkoly
Teď Kiřin deník úkolů. Každý úkol má název a je otevřený, splněný, nebo neúspěšný. Do dat jsme pod Kiru přidali její úkoly. Každý stav má svá data: odměnu (odmena) má jen splněný úkol a důvod neúspěchu (duvod) jen neúspěšný. To je tvar z lekce Modelování dat, ve kterém nemožné kombinace nejdou zapsat: sjednocení se značkou, která se tentokrát jmenuje stav. Třeba objednávky v obchodě:
type Objednavka =
| { stav: "ceka"; zbozi: string }
| { stav: "odeslana"; zbozi: string; dny: number }
| { stav: "zrusena"; zbozi: string; duvod: string };
function popisObjednavku(objednavka: Objednavka): string {
switch (objednavka.stav) {
case "ceka":
return `${objednavka.zbozi}: čeká`;
case "odeslana":
return `${objednavka.zbozi}: dorazí za ${objednavka.dny} dny`;
case "zrusena":
return `${objednavka.zbozi}: zrušeno, ${objednavka.duvod}`;
}
}
const objednavky: Objednavka[] = [
{ stav: "odeslana", zbozi: "Lano", dny: 2 },
{ stav: "zrusena", zbozi: "Lucerna", duvod: "není skladem" },
];
for (const objednavka of objednavky) {
console.log(popisObjednavku(objednavka));
}Vypíše:
Lano: dorazí za 2 dny
Lucerna: zrušeno, není sklademTenhle switch nemá default s kontrolou úplnosti a nepotřebuje ho: stačí návratový typ string. Kdyby některý stav neměl case, funkce by mohla skončit, aniž by něco vrátila, a TypeScript by ohlásil její první řádek: Function lacks ending return statement and return type does not include 'undefined'. (funkci na konci chybí return). Používá se obojí. Kontrola úplnosti s never navíc zapomenutý typ pojmenuje, samotný návratový typ je zase kratší.
Úkoly v datech zatím typ nemají, takže ho TypeScript odvodil z objektů. Jakmile pole anotujete typem Ukol[], TypeScript každý úkol porovná se sjednocením. Ohlásil by třeba splněný úkol bez odměny:
main.ts(99,5): error TS2322: Type '{ stav: "splneny"; nazev: string; }' is not assignable to type 'Ukol'.
Property 'odmena' is missing in type '{ stav: "splneny"; nazev: string; }' but required in type '{ stav: "splneny"; nazev: string; odmena: number; }'.Jak psát:
Pokyny
Pod rozhraní Hrdina napište typ Ukol: sjednocení tří objektových typů, z nichž každý má nazev (text) a stav. Otevřený úkol má stav: "otevreny", splněný stav: "splneny" a odmena (číslo) a neúspěšný stav: "neuspesny" a duvod (text). Pak anotujte pole ukoly typem Ukol[].
Pod najdiPodleNazvu napište funkci popisUkol(ukol: Ukol): string se switch podle ukol.stav. Pro otevřený úkol vrátí [otevřený] Ztracená koruna, pro splněný [splněný] Vlci v lese: +50 zlatých a pro neúspěšný [neúspěšný] Záchrana mlynáře: mlýn vyhořel.
Na konci hlavního programu vypište Úkoly: a pak v cyklu for...of všechny úkoly. Program končí takto:
Úkoly:
[splněný] Vlci v lese: +50 zlatých
[otevřený] Ztracená koruna
[neúspěšný] Záchrana mlynáře: mlýn vyhořel
[splněný] Skřetí most: +30 zlatýchZačněte programovat zdarma
5/7