implements
V lekci 4 jste rozhraním popisovali tvar objektu. Rozhraní může obsahovat i metody. U metody napíšete její název, parametry a návratový typ, bez těla:
interface Postava {
jmeno: string;
zautoc(): number;
}Každá Postava má jméno a metodu zautoc, která vrátí číslo: způsobené poškození. Hra pak může pracovat s jakoukoli postavou, ať je to instance kterékoli třídy: function boj(druzina: Postava[]).
Třída může slíbit, že tento tvar bude mít: class Carodej implements Postava. TypeScript pak třídu zkontroluje hned tam, kde je deklarovaná, a když třída slib nedodrží, dostanete chybu:
interface Postava {
jmeno: string;
zautoc(): number;
}
class Carodej implements Postava {
jmeno: string;
mana: number = 30;
constructor(jmeno: string) {
this.jmeno = jmeno;
}
}TypeScript ohlásí:
main.ts(6,7): error TS2420: Class 'Carodej' incorrectly implements interface 'Postava'.
Property 'zautoc' is missing in type 'Carodej' but required in type 'Postava'.První řádek říká, která třída neodpovídá kterému rozhraní, odsazený řádek proč: chybí zautoc. Přidejte metodu do třídy a chyba zmizí:
zautoc(): number {
return this.mana / 2;
}implements třídě nic nepřidá: všechny vlastnosti a metody napíšete sami. Je to kontrola a zároveň vzkaz pro každého, kdo kód čte: „Tahle třída má být Postava.“ Když má metoda špatný typ, TypeScript to také ohlásí. Když zautoc vrací text, dostanete Property 'zautoc' in type 'Carodej' is not assignable to the same property in base type 'Postava'. (TS2416).
Rozhoduje tvar, ne název. TypeScript porovnává tvary, takže Postava je jakýkoli objekt s vlastností jmeno a metodou zautoc, i bez implements, dokonce i obyčejný objekt:
interface Postava {
jmeno: string;
zautoc(): number;
}
class Carodej implements Postava {
jmeno: string;
mana: number = 30;
constructor(jmeno: string) {
this.jmeno = jmeno;
}
zautoc(): number {
return this.mana / 2;
}
}
class Lucistnik {
jmeno: string = "Kira";
zautoc(): number {
return 7;
}
}
const druzina: Postava[] = [new Carodej("Lena"), new Lucistnik(), { jmeno: "Bruno", zautoc: () => 9 }];
for (const clen of druzina) {
console.log(`${clen.jmeno}: ${clen.zautoc()}`);
}Vypíše:
Lena: 15
Kira: 7
Bruno: 9Lucistnik sice neříká implements Postava, ale tvarem odpovídá, a tak může do pole. S implements se ale o chybějící metodě dozvíte přímo u třídy, a ne až tam, kde instanci poprvé použijete jako Postava. A přes typ Postava smíte používat jen to, co má rozhraní: druzina[0].mana skončí chybou Property 'mana' does not exist on type 'Postava'. (TS2339), přestože čaroděj manu má.
Jak psát:
Pokyny
Napište třídu Mag, která implementuje rozhraní Postava. Má vlastnosti jmeno a mana (číslo), konstruktor, který obě nastaví, a metodu zautoc(), která vrátí trojnásobek many.
Přidejte do pole druzina instanci new Mag("Lena", 5). Program vypíše:
Bruno útočí silou 12
Lena útočí silou 15Každá postava by se také měla umět představit. Přidejte do rozhraní Postava metodu popis(): string;. TypeScript pak ohlásí obě třídy, a tak metodu napište do každé z nich: vrátí Válečník nebo Mág a za tím jméno. Pod cyklus přidejte druhý cyklus přes druzina, který vypíše clen.popis(). Program vypíše:
Bruno útočí silou 12
Lena útočí silou 15
Válečník Bruno
Mág LenaZačněte programovat zdarma
6/9