Vnořené objekty

Vlastnost může obsahovat další objekt. Hrdina má na mapě pozici, tedy x a y. Typ takové vlastnosti je také typ objektu:

type Hrdina = {
    jmeno: string;
    pozice: { x: number; y: number };
};

const kira: Hrdina = { jmeno: "Kira", pozice: { x: 3, y: 4 } };

kira.pozice.x = kira.pozice.x + 1;
console.log(kira);
console.log(kira.pozice.x);

Vypíše:

{ jmeno: "Kira", pozice: { x: 4, y: 4 } }
4

kira.pozice.x čtěte zleva doprava: z kira vezměte pozice, objekt s x a y, a z něj x, číslo. Vnitřní objekt TypeScript kontroluje stejně pečlivě jako ten vnější.

Obvykle je lepší dát vnitřnímu typu vlastní název. Typy se zkrátí, pozici můžete použít i jinde (má ji i příšera nebo poklad) a chybové hlášky budou srozumitelnější. Porovnejte stejnou chybu, pozici bez y, nejdřív s typem napsaným uvnitř typu Hrdina:

type Hrdina = { jmeno: string; pozice: { x: number; y: number } };

const kira: Hrdina = { jmeno: "Kira", pozice: { x: 3 } };
main.ts(3,39): error TS2741: Property 'y' is missing in type '{ x: number; }' but required in type '{ x: number; y: number; }'.

a pak se samostatným typem Pozice:

type Pozice = { x: number; y: number };
type Hrdina = { jmeno: string; pozice: Pozice };

const kira: Hrdina = { jmeno: "Kira", pozice: { x: 3 } };
main.ts(4,39): error TS2741: Property 'y' is missing in type '{ x: number; }' but required in type 'Pozice'.

Všimněte si i sloupce. Ukazuje na vlastnost pozice, ve které je chyba, a ne na začátek objektu kira. Když je něco špatně hluboko uvnitř objektu, TypeScript vám ukáže kde. Čtení vlastnosti, která neexistuje, ohlásí s názvem vnitřního typu:

type Pozice = { x: number; y: number };
type Hrdina = { jmeno: string; pozice: Pozice };

const kira: Hrdina = { jmeno: "Kira", pozice: { x: 3, y: 4 } };
console.log(kira.pozice.z);
main.ts(5,25): error TS2339: Property 'z' does not exist on type 'Pozice'.

Vlastnost může obsahovat i pole. Inventář hrdiny může být inventar: string[], seznam názvů předmětů, nebo s typem Predmet třeba inventar: Predmet[], seznam celých objektů. I tam funguje všechno, co o polích a objektech víte: kira.inventar.push("lano"), kira.inventar.length nebo cyklus for...of přes kira.inventar.

Pokyny

Vytvořte typ Zbran pro Kiřinu zbraň s vlastnostmi nazev typu string a poskozeni typu number.

Vytvořte typ Hrdina s vlastnostmi jmeno (typu string), pozice (typu Pozice) a zbran (typu Zbran) a dejte ho proměnné kira jako anotaci.

Kira ujde 3 kroky na východ: na konci programu zvyšte kira.pozice.x o 3. Pak vypište řádek níže, s hodnotami z kira.pozice:

Kira stojí na 5, 5

V truhle Kira najde lepší luk. Do kira.zbran uložte nový objekt zbraně: Elfí luk s poškozením 12. Pak vypište řádek níže, s hodnotami z kira.zbran:

Kira drží Elfí luk (poškození 12)

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

7/10