Array<T>

Generické typy už nějakou dobu používáte, jen jste o tom nevěděli. Typ pole string[] je zkrácený zápis Array<string>: generického typu Array<T> s typovým argumentem string. Tyto dva řádky znamenají přesně totéž:

const jmena: string[] = ["Kira", "Bruno"];
const stejnaJmena: Array<string> = ["Kira", "Bruno"];

Generické typy dostávají typové argumenty ve špičatých závorkách, stejně jako generické funkce. V typové anotaci je píšete vždycky, protože není z čeho je odvodit. Když na ně zapomenete, TypeScript vám to připomene a ukáže, jak je typ deklarovaný:

const korist: Array = ["Rubín", "Starý klíč"];

TypeScript ohlásí:

main.ts(1,15): error TS2314: Generic type 'Array<T>' requires 1 type argument(s).

Takhle TypeScript popisuje každé pole: Array<T>, kde T je typ prvků, a typ T používají i metody pole. Proto push přijme jen hodnotu typu T a proto find vrací T | undefined: v lekci 5 jste od něj dostávali Predmet | undefined. Generická je i metoda map. Vrací pole toho, co vrací vaše funkce, takže ceny.map(cena => `${cena} zlatých`) je typu string[]. V chybových hláškách TypeScript píše pole tím kratším způsobem, třeba string[].

Kdy je Array<…> přehlednější. V truhle jsou názvy předmětů i mince, takže její prvky jsou typu string | number:

const korist: string | number[] = ["Rubín", 25, "Starý klíč", 10];

TypeScript ohlásí:

main.ts(1,7): error TS2322: Type '(string | number)[]' is not assignable to type 'string | number[]'.
  Type '(string | number)[]' is not assignable to type 'number[]'.
    Type 'string | number' is not assignable to type 'number'.
      Type 'string' is not assignable to type 'number'.

Anotace string | number[] neznamená to, co se zdá: [] patří jen k number, takže typ zní „text, nebo pole čísel“. Odsazené řádky ukazují, jak TypeScript zkouší druhou možnost a narazí na texty. Správný typ je (string | number)[] se závorkami, nebo čitelněji Array<string | number>.

I Record je generický. V lekci 6 jste použili Record<Vzacnost, number>. To je generický typ Record<K, V> se dvěma typovými parametry: K pro klíče a V pro hodnoty. V chybových hláškách se objevuje jako kterýkoli jiný typ:

type Vzacnost = "bezna" | "vzacna" | "legendarni";
const ceny: Record<Vzacnost, number> = { bezna: 5, vzacna: 50 };

TypeScript ohlásí:

main.ts(2,7): error TS2741: Property 'legendarni' is missing in type '{ bezna: number; vzacna: number; }' but required in type 'Record<Vzacnost, number>'.

Oba zápisy polí jsou v pořádku. Mnoho programátorů píše string[], když je typ prvků jednoduchý, a Array<…>, když je delší, třeba sjednocení.

Pokyny

Opravte anotaci proměnné korist: napište její typ pomocí Array<…>, aby program vypsal:

["Rubín", 25, "Starý klíč", 10]

Napište funkci spoctiMince(veci: Array<string | number>): number, která sečte čísla v poli a texty přeskočí (typ zužte pomocí typeof). Vypište s její pomocí, kolik mincí v truhle je:

Mince: 35

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/9