Jeden, nebo více: Array.isArray
Některé funkce je šikovné volat s jednou hodnotou i s několika. V truhle může být jeden předmět, nebo seznam předmětů, a vy byste pro oba případy chtěli volat stejnou funkci: otevriTruhlu("Stříbrný meč") i otevriTruhlu(["Léčivý lektvar", "Lano"]). Takový parametr má typ string | string[]: text, nebo pole textů.
Porovnejte ho s typem pole ze cvičení o typeof: string | string[] je „jeden text, nebo pole textů“, kdežto (string | number)[] je „pole, jehož prvky jsou texty nebo čísla“. O tom, k čemu patří [], rozhodují závorky.
Jak zjistíte, co jste dostali? Pole typeof nepozná: vrátí pro něj "object", stejně jako pro jakýkoli objekt. Na pole má JavaScript zvláštní funkci: Array.isArray(hodnota) vrátí true, když je hodnota pole, a jinak false. TypeScript jí rozumí a typ zúží:
function otevriTruhlu(korist: string | string[]): void {
if (Array.isArray(korist)) {
for (const predmet of korist) {
console.log(`Našli jste: ${predmet}`);
}
} else {
console.log(`Našli jste: ${korist}`);
}
}
otevriTruhlu(["Léčivý lektvar", "Lano"]);
otevriTruhlu("Stříbrný meč");Vypíše:
Našli jste: Léčivý lektvar
Našli jste: Lano
Našli jste: Stříbrný mečUvnitř if je korist typu string[], ve větvi else typu string. Bez kontroly TypeScript dovolí jen to, co funguje pro oba typy, a metody polí mezi to nepatří:
function otevriTruhlu(korist: string | string[]): void {
korist.push("Lano");
}main.ts(2,12): error TS2339: Property 'push' does not exist on type 'string | string[]'.
Property 'push' does not exist on type 'string'.Pozor ale: některé věci fungují pro oba typy, a pak TypeScript nic nenamítne, i když výsledek není takový, jaký jste chtěli. Texty i pole mají length a obojí můžete procházet cyklem for...of. Bez kontroly by otevriTruhlu("Lano") prošla jednotlivá písmena textu:
function otevriTruhlu(korist: string | string[]): void {
for (const predmet of korist) {
console.log(`Našli jste: ${predmet}`);
}
}
otevriTruhlu("Lano");Vypíše:
Našli jste: L
Našli jste: a
Našli jste: n
Našli jste: oTypeScript kontroluje, jestli je to, co děláte, pro dané typy dovolené. Nemůže ale zkontrolovat, jestli je to to, co jste chtěli.
Jak psát:
Pokyny
Program vypíše 3 a 12. TypeScript korist.length dovolí, protože length mají i texty, jenže u "Stříbrný meč" je to počet znaků. Opravte spocitejPredmety pomocí Array.isArray, aby se jeden předmět počítal jako 1. Program pak vypíše:
3
1Pod tento kód napište funkci ukazKorist s parametrem korist typu string | string[]. Funkce vypíše každý předmět na samostatný řádek a před něj - .
Zavolejte ukazKorist pro stejné dvě truhly. Program pak vypíše:
3
1
- Léčivý lektvar
- Starý klíč
- Lano
- Stříbrný mečZačněte programovat zdarma
7/10