Inventář
Teď Kiřin batoh. Nosí v něm tři druhy předmětů: lektvary, které léčí, zbraně, které způsobují poškození, a klíče, které něco otevírají. Každý druh má jiná data, takže inventář je práce pro rozlišené sjednocení z lekce Modelování dat. Každý druh je samostatný objektový typ se značkou druh a Predmet je jejich sjednocení. Dejte každému druhu vlastní název, Lektvar, Zbran a Klic: v dalším kroku budete typ Zbran potřebovat samostatně.
Předmět popíšete pomocí switch podle značky. V každém case TypeScript ví, o jaký druh předmětu jde, takže v case "lektvar" můžete použít predmet.leceni. A do default patří kontrola úplnosti pomocí never z lekce Modelování dat: kdyby někdy přibyl nový druh a jeho case chyběl, TypeScript to ohlásí právě tady. Třeba kouzla:
type OhniveKouzlo = { druh: "ohen"; nazev: string; poskozeni: number };
type LedoveKouzlo = { druh: "led"; nazev: string; kola: number };
type Kouzlo = OhniveKouzlo | LedoveKouzlo;
function popisKouzlo(kouzlo: Kouzlo): string {
switch (kouzlo.druh) {
case "ohen":
return `${kouzlo.nazev}: oheň, poškození ${kouzlo.poskozeni}`;
case "led":
return `${kouzlo.nazev}: led, zmrazí na ${kouzlo.kola} kola`;
default:
const neosetreny: never = kouzlo;
return neosetreny;
}
}
const kouzla: Kouzlo[] = [
{ druh: "ohen", nazev: "Ohnivá koule", poskozeni: 30 },
{ druh: "led", nazev: "Mrazivá vlna", kola: 2 },
];
for (const kouzlo of kouzla) {
console.log(`- ${popisKouzlo(kouzlo)}`);
}Vypíše:
- Ohnivá koule: oheň, poškození 30
- Mrazivá vlna: led, zmrazí na 2 kolaKiřiny předměty přijdou do nové vlastnosti typu Hrdina, inventar: Predmet[]. V konstantě kira je to pole objektů a TypeScript každý z nich porovná s jeho druhem: lektvar s poskozeni místo leceni by byl chyba. Hlavní program pak vypíše nadpis Inventář: a předměty projde cyklem for...of.
Typické chyby:
- Velké písmeno v
case,case "Lektvar":. Značka je přesně text"lektvar", takže TypeScript ohlásíType '"Lektvar"' is not comparable to type '"klic" | "lektvar" | "zbran"'.(typy nejde porovnat) a kvůli tomu i pár dalších chyb pod ní. - Zapomenutý případ. Bez
case "klic"skončí klíč vdefaulta kontrola úplnosti ho pojmenuje:main.ts(36,19): error TS2322: Type 'Klic' is not assignable to type 'never'.
Jak psát:
Pokyny
Pod Povolani napište typy Lektvar (druh: "lektvar", nazev a leceni, číslo), Zbran (druh: "zbran", nazev a poskozeni, číslo) a Klic (druh: "klic", nazev a otevira, text) a type Predmet = Lektvar | Zbran | Klic;. Do rozhraní Hrdina přidejte inventar: Predmet[] a dejte Kiře tři předměty: { druh: "lektvar", nazev: "Léčivý lektvar", leceni: 20 }, { druh: "zbran", nazev: "Stříbrný meč", poskozeni: 12 } a { druh: "klic", nazev: "Starý klíč", otevira: "kryptu" }.
Pod popisHrdinu napište funkci popisPredmet(predmet: Predmet): string se switch podle predmet.druh a s kontrolou úplnosti v default. Pro lektvar vrátí Léčivý lektvar (léčí 20), pro zbraň Stříbrný meč (poškození 12) a pro klíč Starý klíč (otevírá kryptu).
V hlavním programu pod řádkem o Kiře vypište Inventář: a pak v cyklu for...of každý předmět se znaky - na začátku:
Kira (hranicar), úroveň 3, životy 34/50, zlato 120
Inventář:
- Léčivý lektvar (léčí 20)
- Stříbrný meč (poškození 12)
- Starý klíč (otevírá kryptu)Začněte programovat zdarma
2/7