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 }
undefinedTroll 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: trollFunkce, 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.
Jak psát:
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ýchPod 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
5/10