Typy funkcí
Funkce je v JavaScriptu hodnota. Můžete ji uložit do proměnné, jak to děláte u šipkových funkcí, a předat ji jiné funkci jako argument. V TypeScriptu má každá hodnota typ, a tak ho má i funkce. Typ funkce, jako je tato,
const kriticky = (sila: number): number => sila * 2;se zapíše (sila: number) => number: „funkce, která dostane číslo a vrátí číslo“. Vypadá jako šipková funkce, jen za šipkou není tělo, ale návratový typ. Takové typy uvidíte v chybových hláškách, třeba když se do proměnné pokusíte uložit něco jiného:
let kouzlo = (cil: string): string => `Oheň zasáhl cíl: ${cil}`;
kouzlo = 5;main.ts(2,1): error TS2322: Type 'number' is not assignable to type '(cil: string) => string'.Typy funkcí potřebujete u parametrů, ve kterých je funkce. Kira umí udeřit různými způsoby a funkce zautoc dostane způsob úderu jako argument:
function zautoc(prisera: string, sila: number, uder: (sila: number) => number): string {
return `Cíl: ${prisera}, poškození: ${uder(sila)}`;
}
const obycejny = (sila: number): number => sila;
const kriticky = (sila: number): number => sila * 2;
console.log(zautoc("skřet", 10, obycejny));
console.log(zautoc("troll", 10, kriticky));Vypíše:
Cíl: skřet, poškození: 10
Cíl: troll, poškození: 20Uvnitř je uder parametr jako každý jiný, jenže je v něm funkce, a tak ji zavoláte: uder(sila). Ve volání předejte samotnou funkci, bez závorek: kriticky, ne kriticky(10). Se závorkami byste ji rovnou zavolali a předali její výsledek, číslo 20:
function zautoc(prisera: string, sila: number, uder: (sila: number) => number): string {
return `Cíl: ${prisera}, poškození: ${uder(sila)}`;
}
const obycejny = (sila: number): number => sila;
const kriticky = (sila: number): number => sila * 2;
console.log(zautoc("troll", 10, kriticky(10)));main.ts(8,33): error TS2345: Argument of type 'number' is not assignable to parameter of type '(sila: number) => number'.TypeScript také kontroluje, že předaná funkce má správný tvar. Funkce, která chce text, se nehodí:
function zautoc(prisera: string, sila: number, uder: (sila: number) => number): string {
return `Cíl: ${prisera}, poškození: ${uder(sila)}`;
}
const obycejny = (sila: number): number => sila;
const kriticky = (sila: number): number => sila * 2;
const zakric = (text: string): string => text.toUpperCase();
console.log(zautoc("vlk", 10, zakric));main.ts(10,31): error TS2345: Argument of type '(text: string) => string' is not assignable to parameter of type '(sila: number) => number'.
Types of parameters 'text' and 'sila' are incompatible.
Type 'number' is not assignable to type 'string'.Odsazené řádky vysvětlují proč: parametry text a sila k sobě nepasují (are incompatible). zautoc bude funkci volat s číslem, ale zakric chce text.
Dlouhý typ funkce dělá seznam parametrů nepřehledným. Pojmenujte ho pomocí type:
type Uder = (sila: number) => number;
function zautoc(prisera: string, sila: number, uder: Uder): string {type vytvoří typový alias, nový název pro typ. Uder teď znamená (sila: number) => number a chybové hlášky používají nový název (parameter of type 'Uder'). Názvy typů se podle zvyklosti píšou s velkým písmenem na začátku. V příští lekci budete typové aliasy používat hodně, hlavně pro objekty.
Alias můžete použít i u proměnné. Parametr šipkové funkce pak nepotřebuje vlastní typ, TypeScript ho vezme z typu Uder:
const kriticky: Uder = (sila) => sila * 2;S tím se znovu setkáte v příštím cvičení.
Jak psát:
Pokyny
Na začátku programu vytvořte typový alias PravidloCeny pro funkci, která dostane číslo cena a vrátí číslo.
Napište funkci cenovka se třemi parametry: predmet typu string, cena typu number a pravidlo typu PravidloCeny. Vrátí text jako Lano: 5 zlatých, kde cena je výsledek pravidlo(cena).
Vypište cenovka("Stříbrný meč", 120, bezneCena), cenovka("Léčivý lektvar", 40, vyprodej) a cenovka("Lano", 10, cenaProCech). Program vypíše:
Stříbrný meč: 120 zlatých
Léčivý lektvar: 20 zlatých
Lano: 5 zlatýchV tržní den stojí všechno o 10 zlatých víc. Vytvořte pravidlo trzniDen s typem PravidloCeny, aby jeho parametr nepotřeboval vlastní typ: const trzniDen: PravidloCeny = (cena) => .... Pak vypište cenovka("Lucerna", 15, trzniDen), což vypíše Lucerna: 25 zlatých.
Začněte programovat zdarma
8/10