Třídy a new
Zatím jste objekty vytvářeli tak, že jste je rovnou zapsali do kódu, { jmeno: "Skřet", zivoty: 30 }, nebo funkcí, která objekt vrátí. Když hra potřebuje hodně objektů stejného druhu, nabízí JavaScript ještě jinou cestu: třídu. Třída je šablona pro objekty. Jednou v ní popíšete, co bude mít každý objekt, který podle ní vznikne:
class Prisera {
jmeno: string = "Skřet";
zivoty: number = 30;
}
const skret = new Prisera();
const vlk = new Prisera();
vlk.jmeno = "Vlk";
console.log(skret);
console.log(vlk);Vypíše:
Prisera { jmeno: "Skřet", zivoty: 30 }
Prisera { jmeno: "Vlk", zivoty: 30 }Popořadě:
class Prisera { … }deklaruje třídu jménemPrisera. Názvy tříd začínají velkým písmenem, stejně jako názvy typů.- Uvnitř třídy jsou její vlastnosti: ty bude mít každý objekt této třídy. (Anglicky se jim u tříd říká fields.) Vlastnost se píše jako v objektovém typu, tedy název a typ, a za ně
=a počáteční hodnota. Každá vlastnost končí středníkem. new Prisera()vytvoří podle šablony nový objekt a nastaví jeho vlastnostem počáteční hodnoty. Takovému objektu se říká instance třídy. Každénewvytvoří samostatný objekt, takže změnavlk.jmenona objektskretnemá vliv.console.logpřed objekt napíše název třídy, takže vidíte, podle čeho objekt vznikl.
Třídy jsou součástí JavaScriptu, TypeScript k nim přidává typy vlastností. Stejně jako u proměnných můžete typ vynechat, když má vlastnost počáteční hodnotu: zivoty = 30; je typu number.
Třída je zároveň typ. Název Prisera můžete použít v anotacích, stejně jako typy z lekce 4: const boss: Prisera = new Prisera(); nebo function zasahni(prisera: Prisera): void. TypeScript kontroluje vlastnosti tříd stejně jako vlastnosti objektů: skret.zivot skončí chybou Property 'zivot' does not exist on type 'Prisera'. Did you mean 'zivoty'? (TS2551) a skret.zivoty = "hodně"; chybou TS2322.
Každá vlastnost potřebuje hodnotu. Když počáteční hodnotu vynecháte, dostanete chybu:
class Prisera {
jmeno: string = "Skřet";
zivoty: number;
}TypeScript ohlásí:
main.ts(3,5): error TS2564: Property 'zivoty' has no initializer and is not definitely assigned in the constructor.Bez této kontroly by nová příšera měla ve vlastnosti zivoty hodnotu undefined, přestože podle typu jde o číslo. Hláška zmiňuje konstruktor (constructor), druhý způsob, jak vlastnosti dát hodnotu. Ten přijde na řadu v příštím cvičení.
Typické chyby:
- Chybějící
new:const skret = Prisera();skončí chybouValue of type 'typeof Prisera' is not callable. Did you mean to include 'new'?(TS2348). - Vlastnost zapsaná jako v objektu:
jmeno: "Skřet";. Za dvojtečkou následuje typ, takže z"Skřet"se stane literálový typ vlastnosti, vlastnost nedostane žádnou hodnotu a přijde chyba TS2564. Hodnota se píše za=. - Vlastnosti oddělené čárkami, jako v objektu: TypeScript ohlásí
';' expected.(TS1005).
Jak psát:
Pokyny
Deklarujte třídu Prisera se dvěma vlastnostmi: jmeno typu string s počáteční hodnotou "Skřet" a zivoty typu number s počáteční hodnotou 30.
Pod třídou vytvořte pomocí new dvě příšery: skret a vlk. Vlkovi změňte jmeno na "Vlk" a zivoty na 25. Pak obě příšery vypište:
Prisera { jmeno: "Skřet", zivoty: 30 }
Prisera { jmeno: "Vlk", zivoty: 25 }Napište funkci zasahni(prisera: Prisera, poskozeni: number): void, která příšeře ubere poskozeni životů. Na konci programu zavolejte zasahni(vlk, 10) a vypište vlkovo jméno a životy takto:
Vlk: 15Začněte programovat zdarma
1/9