Chybějící a přebývající vlastnosti

Když má proměnná typ, TypeScript zkontroluje každý objekt, který do ní uložíte, vlastnost po vlastnosti. Pořád dokola se objevují dvě chyby: nějaká vlastnost chybí, nebo jedna přebývá. Nejdřív chybějící vlastnost:

type Predmet = { nazev: string; cena: number };

const lano: Predmet = { nazev: "Lano" };
main.ts(3,7): error TS2741: Property 'cena' is missing in type '{ nazev: string; }' but required in type 'Predmet'.

Čtěte to takhle: objekt, který jste napsali, má typ { nazev: string; }, ale Predmet vyžaduje ještě cena. V JavaScriptu by se lano dostalo do obchodu bez ceny a součet nákupu by vyšel NaN. Když chybí víc vlastností, hláška je vyjmenuje všechny, například Type '{ nazev: string; }' is missing the following properties from type 'Predmet': cena, vaha (TS2739).

Teď vlastnost, která přebývá:

type Predmet = { nazev: string; cena: number };

const lano: Predmet = { nazev: "Lano", cena: 5, vaha: 2 };
main.ts(3,49): error TS2353: Object literal may only specify known properties, and 'vaha' does not exist in type 'Predmet'.

Objektový literál (object literal) je objekt zapsaný přímo v kódu, ve složených závorkách. Přebývající vlastnost v něm obvykle znamená jedno ze dvou. Buď typu chybí vlastnost, kterou potřebujete, a pak ji do typu přidáte, nebo vlastnost do objektu nepatří, a pak ji smažete.

Velmi často jde o překlep. TypeScript pak odhadne, co jste mysleli:

type Predmet = { nazev: string; cena: number };

const lano: Predmet = { nazev: "Lano", cenna: 5 };
main.ts(3,40): error TS2561: Object literal may only specify known properties, but 'cenna' does not exist in type 'Predmet'. Did you mean to write 'cena'?

Přebývající vlastnosti se kontrolují jen u objektových literálů. Objekt, který už existuje v jiné proměnné, smí mít víc vlastností, než typ potřebuje. TypeScript jen vyžaduje, aby měl všechny vlastnosti typu:

type Predmet = { nazev: string; cena: number };

const korist = { nazev: "Lano", cena: 5, vaha: 2 };
const lano: Predmet = korist;
console.log(lano);

Vypíše:

{ nazev: "Lano", cena: 5, vaha: 2 }

Tak TypeScript o objektech uvažuje obecně: objekt je Predmet, když má všechno, co Predmet potřebuje.

Pokyny

Opravte obě příšery, které TypeScript hlásí. U trolla je překlep a skřetovi chybí poškození: způsobuje 3. Program vypíše:

vlk: 30 životů, poškození 6
troll: 80 životů, poškození 12
skřet: 20 životů, poškození 3

Do lesa přišel pavouk. Pod skřeta přidejte const pavouk: Prisera = { jmeno: "pavouk", zivoty: 15, poskozeni: 4, odmena: 8 }; a na konci vypište popis(pavouk). TypeScript ohlásí vlastnost odmena, kterou příšery nemají. Tentokrát něco chybí typu: přidejte do typu Prisera vlastnost odmena: number. TypeScript pak ohlásí zbylé tři příšery, protože žádnou odměnu nemají. Doplňte ji: 10 za vlka, 40 za trolla a 5 za skřeta. Program pak vypíše i pavouk: 15 životů, poškození 4.

Na konci programu vypište odměnu za všechny čtyři příšery dohromady, jako součet jejich vlastností odmena:

Odměna: 63 zlatých

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

3/10