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í.
Jak psát:
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: 35Začněte programovat zdarma
4/9