Když find() nic nenajde

Když v poli hledáte jednu věc, můžete použít metodu find() (anglicky „najdi“). Funguje podobně jako filter() z lekce Funkce: předáte jí funkci a ona ji postupně zavolá pro jednotlivé prvky. Nevrací ale pole všech shod. Vrátí první prvek, pro který funkce vrátí true, a dál už nehledá:

type Prisera = { jmeno: string; sila: number };

const prisery: Prisera[] = [
    { jmeno: "skřet", sila: 4 },
    { jmeno: "vlk", sila: 7 },
    { jmeno: "troll", sila: 15 },
    { jmeno: "drak", sila: 40 },
];

const silna = prisery.find(prisera => prisera.sila > 10);
console.log(silna);
const obr = prisery.find(prisera => prisera.sila > 100);
console.log(obr);

Vypíše:

{ jmeno: "troll", sila: 15 }
undefined

Troll je první příšera se sílou větší než 10. Sílu větší než 100 nemá žádná příšera, a tak druhé hledání nic nenašlo a find() vrátila undefined.

Proto výsledek není typu Prisera, ale Prisera | undefined. A TypeScript vám ho nedovolí použít jako příšeru, dokud ho nezkontrolujete. Se stejným polem:

const silna = prisery.find(prisera => prisera.sila > 10);
console.log(`První silná příšera: ${silna.jmeno}`);
main.ts(11,37): error TS18048: 'silna' is possibly 'undefined'.

Vy v poli trolla vidíte, ale TypeScript se na data nedívá: pole se může změnit, podmínka taky. V JavaScriptu by hledání, které nic nenašlo, shodilo program až později, chybou TypeError: Cannot read properties of undefined (reading 'jmeno'), a to často daleko od místa, kde se hledalo. TypeScript vás donutí myslet na „nic se nenašlo“ přímo tam, kde to může nastat:

const silna = prisery.find(prisera => prisera.sila > 10);
if (silna === undefined) {
    console.log("Žádná silná příšera tu není");
} else {
    console.log(`První silná příšera: ${silna.jmeno}`);
}

Vypíše:

První silná příšera: troll

Funkce, která hledá, to musí říct i svým návratovým typem. Když slíbí typ Prisera, TypeScript ohlásí její return (zase pod stejným polem):

function najdiPriseru(jmeno: string): Prisera {
    return prisery.find(prisera => prisera.jmeno === jmeno);
}
main.ts(11,5): error TS2322: Type 'Prisera | undefined' is not assignable to type 'Prisera'.
  Type 'undefined' is not assignable to type 'Prisera'.

Opravou je poctivý návratový typ Prisera | undefined. Kdo funkci zavolá, výsledek pak zkontroluje.

Typická chyba: = místo === ve funkci. prisery.find(prisera => prisera.jmeno = "vlk") neporovnává: první příšeru přejmenuje na "vlk" a vrátí ji, takže dostanete { jmeno: "vlk", sila: 4 }, přejmenovaného skřeta. TypeScript to neohlásí, protože find() přijme jako odpověď funkce jakoukoli hodnotu.

Pokyny

Spusťte program a opravte chyby: když je klic undefined, vypište Starý klíč v inventáři není; jinak vypište jeho název a cenu jako dosud. Program pak vypíše:

Starý klíč: 5 zlatých

Pod tento kód napište funkci najdiPredmet s parametrem nazev (text), která vrátí předmět z pole inventar s tímto názvem. Použijte find() a dejte funkci správný návratový typ.

Použijte najdiPredmet pro názvy "Stříbrný meč" a "Dračí vejce". U předmětu, který existuje, vypište jeho název a cenu jako výše; u toho, který neexistuje, vypište Dračí vejce v inventáři není (s názvem, který jste hledali). Program pak vypíše:

Starý klíč: 5 zlatých
Stříbrný meč: 80 zlatých
Dračí vejce v inventáři není

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

5/10