Hledání

Zatím hlavní program vybíral předměty podle jejich pozice v poli. To je křehké: když přibude předmět na začátek inventáře, je kira.inventar[0] najednou něco jiného. Lepší je hledat předmět podle názvu. A funkce, která najde něco podle názvu, se nehodí jen na předměty: název má i kouzlo v knize, úkol v deníku nebo zboží v obchodě. Proto bude generická, jako v lekci o generikách.

Typový parametr T je typ věcí v poli. Funkce od nich potřebuje jedinou věc, nazev, a právě to říká omezení: T extends { nazev: string }. Bez něj TypeScript neví, jestli T vůbec nějaký název má: main.ts(63,33): error TS2339: Property 'nazev' does not exist on type 'T'.

Metoda pole find z lekce o sjednocených typech vrátí první prvek, pro který funkce vrátí true, nebo undefined, když žádný takový prvek není. Funkce proto vrací T | undefined a kdo ji volá, musí ošetřit oba případy. Jiný příklad, funkce, která najde něco dané úrovně:

function najdiPodleUrovne<T extends { uroven: number }>(veci: T[], uroven: number): T | undefined {
    return veci.find(vec => vec.uroven === uroven);
}

const druzina = [
    { jmeno: "Bruno", uroven: 5 },
    { jmeno: "Lena", uroven: 2 },
];
const ukoly = [
    { nazev: "Krysy ve sklepě", uroven: 1 },
    { nazev: "Trollí jeskyně", uroven: 5 },
];

const hrdina = najdiPodleUrovne(druzina, 2);
console.log(hrdina?.jmeno);
const ukol = najdiPodleUrovne(ukoly, 3);
if (ukol === undefined) {
    console.log("Pro úroveň 3 tu žádný úkol není");
} else {
    console.log(ukol.nazev);
}

Vypíše:

Lena
Pro úroveň 3 tu žádný úkol není

Jedna funkce funguje pro hrdiny i pro úkoly a výsledek si nechá svůj úplný typ: ukol.nazev je v pořádku, protože tam je T typ úkolu. K ukol.nazev vás ale TypeScript pustí až po kontrole na undefined.

Hlavní program zkusí použít tři předměty podle názvu: lektvar, meč a dračí vejce, které Kira nemá. Cyklus for...of může procházet i pole napsané přímo v něm: for (const nazev of ["Léčivý lektvar", "Stříbrný meč", "Dračí vejce"]). Když to, co vrátí najdiPodleNazvu, předáte bez kontroly rovnou funkci pouzijPredmet, TypeScript to ohlásí:

main.ts(90,37): error TS2345: Argument of type 'Predmet | undefined' is not assignable to parameter of type 'Predmet'.
  Type 'undefined' is not assignable to type 'Predmet'.

Pokyny

Pod pouzijPredmet napište generickou funkci najdiPodleNazvu<T extends { nazev: string }>(veci: T[], nazev: string): T | undefined, která pomocí find vrátí první věc s tímto názvem.

V hlavním programu nahraďte oba řádky s pouzijPredmet cyklem for...of přes názvy "Léčivý lektvar", "Stříbrný meč" a "Dračí vejce". Pro každý název najděte předmět v Kiřině inventáři pomocí najdiPodleNazvu. Když tam není, vypište Kira nemá Dračí vejce (jméno hrdiny a hledaný název), jinak vypište, co vrátí pouzijPredmet. Program končí takto:

Kira vypije Léčivý lektvar: životy 50/50
Kira si vezme Stříbrný meč
Kira nemá Dračí vejce

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

4/7