Používání předmětů
Předměty jsou od toho, aby se používaly: lektvar Kiru vyléčí, zbraň si vezme do ruky a klíč něco otevře. Použití předmětu hrdinu mění, takže ho funkce dostane jako parametr a mění jeho vlastnosti. Objekty se při předání funkci nekopírují, a změny se proto projeví přímo na kira.
Kam si Kira dá zbraň, kterou drží v ruce? Do nové vlastnosti zbran. Na začátku dobrodružství má ruku prázdnou, takže vlastnost bude nepovinná, jako v lekci o typech objektů: zbran?: Zbran. Třeba hraničářka a její zvířecí společník:
type Zvire = { jmeno: string; druh: string };
interface Hranicar {
jmeno: string;
zvire?: Zvire;
}
function ochoc(hranicar: Hranicar, zvire: Zvire): string {
hranicar.zvire = zvire;
return `${hranicar.jmeno} ochočí zvíře: ${zvire.druh} ${zvire.jmeno}`;
}
const ema: Hranicar = { jmeno: "Ema" };
console.log(ema.zvire?.jmeno ?? "žádné zvíře");
console.log(ochoc(ema, { jmeno: "Stín", druh: "vlk" }));
console.log(ema.zvire?.jmeno ?? "žádné zvíře");Vypíše:
žádné zvíře
Ema ochočí zvíře: vlk Stín
StínFunkce pouzijPredmet je switch podle predmet.druh, stejně jako popisPredmet, jen některé případy hrdinu nejdřív změní a teprve pak vrátí text:
- Lektvar přičte
predmet.lecenik životům. Když jich je pak víc nežmaxZivoty, nastaví je namaxZivoty: Kira má 34 životů, lektvar léčí 20 a 54 by bylo víc než jejích 50. - Zbraň si vezme do ruky:
hrdina.zbran = predmet;. Funguje to jen uvnitřcase "zbran", kde TypeScript ví, že předmět jeZbran. Nad příkazemswitchby předmět mohl být jakéhokoli druhu a TypeScript by ohlásil:main.ts(46,5): error TS2322: Type 'Predmet' is not assignable to type 'Zbran | undefined'. Property 'poskozeni' is missing in type 'Klic' but required in type 'Zbran'. - Klíč nic nemění, jen vrátí
Kira otevře kryptu.
I tady napište návratový typ string. TypeScript pak zkontroluje, že každý case vrací text. A jak uvidíte v posledním kroku, ohlásí i druh předmětu, pro který case chybí, a to i bez kontroly úplnosti: funkce by skončila, aniž by vrátila text.
V hlavním programu je kira.inventar[0] první předmět (lektvar) a kira.inventar[1] druhý (meč). Kiřino jmeno je jen pro čtení, ale to nevadí: pouzijPredmet ho jen čte.
Jak psát:
Pokyny
Do rozhraní Hrdina přidejte nepovinnou vlastnost zbran typu Zbran.
Pod popisPredmet napište funkci pouzijPredmet(hrdina: Hrdina, predmet: Predmet): string se switch podle predmet.druh. Pro lektvar vrátí Kira vypije Léčivý lektvar: životy 50/50 (jméno hrdiny, název předmětu a nové životy), pro zbraň Kira si vezme Stříbrný meč a pro klíč Kira otevře kryptu.
Na konci hlavního programu Kira použije své první dva předměty: vypište pouzijPredmet(kira, kira.inventar[0]) a pouzijPredmet(kira, kira.inventar[1]). Program končí takto:
- Starý klíč (otevírá kryptu)
Kira vypije Léčivý lektvar: životy 50/50
Kira si vezme Stříbrný mečPokud má Kira 54/50, lektvar ji vyléčil nad maximum.
Začněte programovat zdarma
3/7