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 kola

Kiř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íč v default a kontrola úplnosti ho pojmenuje: main.ts(36,19): error TS2322: Type 'Klic' is not assignable to type 'never'.

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

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

Nebo se registrujte pomocí:

2/7