Typy parametrů
V kurzu JavaScriptu jste psali funkce, jako je tahle. Přičte k životům hrdiny, kolik jich vyléčí lektvar:
function vylec(zivoty, leceni) {
return zivoty + leceni;
}
console.log(vylec(30, 20));
console.log(vylec(45, "5"));V JavaScriptu by tento kód vypsal 50 a pak 455. Druhé volání totiž předává text "5" a + s textem nesčítá, ale spojuje. Hrdina má najednou 455 životů a nikdo si toho dlouho nevšimne.
V TypeScriptu se tento program vůbec nespustí. Překladač ohlásí:
main.ts(1,16): error TS7006: Parameter 'zivoty' implicitly has an 'any' type.
main.ts(1,24): error TS7006: Parameter 'leceni' implicitly has an 'any' type.TypeScript sice umí typ proměnné odvodit z její hodnoty, jenže parametr ve funkci samotné žádnou hodnotu nemá. Dostane ji až při volání a každé volání může předat něco jiného. TypeScript tedy neví, co v parametru zivoty bude, a musel by parametru dát typ any, který, jak víte z minulé lekce, kontrolu vypíná. Přesně to říká hláška: parametr má implicitně (aniž byste to napsali) typ any. To TypeScript nedovolí a chce, abyste typ napsali sami.
Typ parametru se píše stejně jako typ proměnné, dvojtečkou a typem za názvem:
function vylec(zivoty: number, leceni: number) {
return zivoty + leceni;
}
console.log(vylec(30, 20));
console.log(vylec(45, "5"));main.ts(6,23): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.Teď TypeScript ví, co funkce potřebuje, a kontroluje každé volání. Tuhle hlášku znáte ze cvičení o polích v minulé lekci, kde push dostal špatnou hodnotu: i push je funkce, jejíž parametr má typ. Sloupec 23 ukazuje přesně na argument "5". Ten je typu string, ale parametr leceni je typu number. Když ho změníte na 5, program vypíše dvakrát 50.
Typy pomáhají i uvnitř funkce. TypeScript ví, že zivoty je číslo, a tak by zivoty.toUpperCase() v těle funkce byla chyba, stejně jako u proměnné.
Typické chyby:
- Typ jen u některých parametrů. V zápisu
function vylec(zivoty, leceni: number)pořád nemázivotyžádný typ a dostanete pro něj TS7006. Typ potřebuje každý parametr zvlášť, i když mají všechny stejný. - Rovnítko místo dvojtečky.
function vylec(zivoty = number, leceni = number)skončí hláškou'number' only refers to a type, but is being used as a value here.(numberje jen typ, ale používáte ho jako hodnotu). Za rovnítko patří výchozí hodnota parametru, jak ji znáte z kurzu JavaScriptu, anumberje typ, ne hodnota.
Jak psát:
Pokyny
Dejte oběma parametrům funkce vylec typ number. Spusťte program: TypeScript teď najde chybu na posledním řádku. Opravte ji: lektvar léčí 5 životů, takže předejte číslo 5, ne text "5".
Pod funkci vylec napište funkci popisHrdinu se dvěma parametry: jmeno typu string a uroven typu number. Funkce vrátí text jako Kira, úroveň 3.
Na konci programu vypište popisHrdinu("Kira", 3). Program vypíše:
50
50
Kira, úroveň 3Začněte programovat zdarma
1/10