Shrnutí

V této lekci jste se naučili, že:

  • Funkce, která má fungovat s každým typem, o typ přijde s any (chyby proklouznou) i s unknown (po každém volání musíte zužovat). Funkce pro každý typ zvlášť opakují stejný kód. Řešením jsou generika.
  • Generická funkce má ve špičatých závorkách typový parametr: function prvni<T>(prvky: T[]): T | undefined. T je typ, který se dosadí při každém volání: pro prvni(jmena) je T typ string.
  • Typové argumenty TypeScript odvodí z argumentů. Můžete je napsat i sami, prvni<string>(jmena); je to potřeba, když by TypeScript odvodil příliš úzký typ: naplnTri<string | null>(null). Funkce může mít víc typových parametrů: dvojice<A, B>(prvni: A, druhy: B): [A, B].
  • string[] je zkratka pro Array<string>. U sjednocení je Array<string | number> čitelnější než (string | number)[]; string | number[] znamená něco jiného. Generický typ je i Record<K, V>.
  • I vaše vlastní typy můžou být generické: type Truhla<T> = { misto: string; korist: T };, interface Police<T> { veci: T[] }. U proměnné typový argument napíšete: Truhla<number>.
  • type Vysledek<T> = { ok: true; hodnota: T } | { ok: false; chyba: string }; popisuje výsledek něčeho, co může selhat. Než použijete vysledek.hodnota, zkontrolujte if (vysledek.ok).
  • Omezení zužuje, co smí být typový parametr: <T extends { sila: number }>. Uvnitř funkce je pak vec.sila dovolené a výsledek si zachová celý typ, se kterým byla funkce zavolaná.
  • keyof Schopnosti je sjednocení klíčů typu Schopnosti. Funkce <K extends keyof Hrdina>(hrdina: Hrdina, klic: K): Hrdina[K] přečte vlastnost podle klíče a vrátí její přesný typ.

V příští lekci, Třídy, budete vytvářet objekty podle šablony: třída jednou popíše, co má každý hrdina nebo příšera a co umí, a TypeScript to celé zkontroluje.

Pokyny

Teď si vše procvičte. Obchod prodává lektvary a zbraně, které jsou různých typů, ale obojí má vlastnost cena. V editoru najdete typ Vysledek z této lekce a zboží z obchodu. Regál se zbraněmi je dnes prázdný. Napište generickou funkci nejlevnejsi<T extends { cena: number }>(veci: T[]): Vysledek<T>. Pro prázdné pole selže s chybou "není co koupit". Jinak uspěje a hodnotou bude věc s nejnižší cenou.

Pomocí nejlevnejsi najděte nejlevnější lektvar. Když se to povede, vypište jeho jméno a kolik léčí, jinak vypište chybu:

Malý lektvar léčí 5

Totéž udělejte pro zbraně: když nejlevnejsi uspěje, vypište jméno zbraně a její poskozeni, jinak Žádná zbraň: a chybu. Regál se zbraněmi je prázdný, takže program vypíše:

Malý lektvar léčí 5
Žádná zbraň: není co koupit

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

9/9