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énem Prisera. 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é new vytvoří samostatný objekt, takže změna vlk.jmeno na objekt skret nemá vliv.
  • console.log př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čí chybou Value 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).

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: 15

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

1/9