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: o

TypeScript kontroluje, jestli je to, co děláte, pro dané typy dovolené. Nemůže ale zkontrolovat, jestli je to to, co jste chtěli.

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
1

Pod 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

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

Nebo se registrujte pomocí:

7/10