Objekty ve funkcích

Typy objektů se nejvíc hodí ve funkcích, jako typy parametrů a návratové typy. První řádek funkce pak řekne všechno podstatné: co funkce dostane a co vrátí.

Funkce, která vytváří objekty stejného tvaru (často se jí říká továrna, anglicky factory), dostane jejich typ jako návratový typ. TypeScript pak zkontroluje objekt, který vrací:

interface Prisera {
    jmeno: string;
    uroven: number;
    zivoty: number;
}

function vytvorPriseru(jmeno: string, uroven: number): Prisera {
    return { jmeno: jmeno, zivoty: uroven * 10 };
}
main.ts(8,5): error TS2741: Property 'uroven' is missing in type '{ jmeno: string; zivoty: number; }' but required in type 'Prisera'.

Bez návratového typu by funkce vrátila příšeru bez uroven a chyba by se projevila až později, všude tam, kde se úroveň příšery čte. S ním TypeScript ohlásí přímo return.

Tady je opravená verze, spolu s funkcí, která příšeru mění:

interface Prisera {
    jmeno: string;
    uroven: number;
    zivoty: number;
}

function vytvorPriseru(jmeno: string, uroven: number): Prisera {
    return { jmeno: jmeno, uroven: uroven, zivoty: uroven * 10 };
}

function rozzur(prisera: Prisera): void {
    prisera.uroven = prisera.uroven + 2;
}

const vlk = vytvorPriseru("vlk", 3);
rozzur(vlk);
console.log(vlk);

Vypíše:

{ jmeno: "vlk", uroven: 5, zivoty: 30 }

vlk dostane typ Prisera z návratového typu funkce, bez anotace. rozzur mění přímo ten objekt, který jí předáte, ne jeho kopii, takže je změna vidět i mimo funkci, stejně jako když zvysUroven zvýšila Kiřinu úroveň ve cvičení o vlastnostech jen pro čtení. Její návratový typ je void: nic nevrací, jejím výsledkem je změna.

Volání se kontrolují stejně jako u parametrů jiných typů:

interface Prisera {
    jmeno: string;
    uroven: number;
    zivoty: number;
}

function rozzur(prisera: Prisera): void {
    prisera.uroven = prisera.uroven + 2;
}

rozzur("vlk");
rozzur({ jmeno: "troll", uroven: 4, zivoty: 40, nastvany: true });
main.ts(11,8): error TS2345: Argument of type 'string' is not assignable to parameter of type 'Prisera'.
main.ts(12,49): error TS2353: Object literal may only specify known properties, and 'nastvany' does not exist in type 'Prisera'.

První volání předává místo příšery text. Druhé předává objektový literál s vlastností navíc, jako ve cvičení o přebývajících vlastnostech.

Typické chyby:

  • Vlastnost chybí ve vráceném objektu: Property 'uroven' is missing in type ..., ohlášené u return.
  • Předání něčeho jiného než objektu, třeba jména příšery: Argument of type 'string' is not assignable to parameter of type 'Prisera'.

Pokyny

Napište funkci vytvorPriseru s parametry jmeno (typu string) a uroven (typu number) a návratovým typem Prisera. Vrátí novou příšeru s tímto jménem a úrovní a se zivoty rovnými uroven * 10.

Pomocí vytvorPriseru vytvořte vlk, vlka úrovně 2, a troll, trolla úrovně 5. Oba vypište pomocí popis. Program vypíše:

vlk: úroveň 2, 20 životů
troll: úroveň 5, 50 životů

Napište funkci trenuj s parametrem prisera typu Prisera a návratovým typem void. Zvýší příšeře úroveň o 1 a životy o 10.

Vlka dvakrát natrénujte a pak ho znovu vypište pomocí popis. Program na konci vypíše:

vlk: úroveň 4, 40 životů

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

9/10