Ce face funcții cu tipuri
La o funcție scrii tipul fiecărui parametru după numele lui și, opțional, tipul rezultatului după paranteze: function aduna(a: number, b: number): number. La fiecare apel, TypeScript verifică numărul argumentelor și tipul lor. Spre deosebire de JavaScript, nu poți apela o funcție cu mai puține sau mai multe argumente decât are (pentru asta există parametri opționali și rest).
Tipul rezultatului se deduce din return, dar e bine să-l scrii la funcțiile exportate: dacă greșești în corpul funcției, eroarea apare în funcție, nu în locurile unde e folosită. Tipul unei funcții se poate da și separat, cu un alias: type Operatie = (a: number, b: number) => number.
Funcțiile sunt valori: le poți pune în variabile, le poți da ca argument altor funcții (callback) și le poți returna. Pentru funcții care merg cu mai multe tipuri vezi generics.
Exemple
Exemplul 1: Parametri și rezultat cu tip
function pretCuTva(pret: number, cota: number): number {
return Math.round(pret * (1 + cota) * 100) / 100;
}
function eticheta(produs: string, pret: number): string {
return `${produs}: ${pretCuTva(pret, 0.21).toFixed(2)} lei cu TVA`;
}
console.log(eticheta("Caiet", 10));
console.log(eticheta("Pix", 3.5));
Rezultat
Caiet: 12.10 lei cu TVA
Pix: 4.23 lei cu TVA
Exemplul 2: Tip de funcție și callback
Operatie descrie orice funcție cu doi parametri numerici și rezultat numeric.
type Operatie = (a: number, b: number) => number;
const operatii: Record<string, Operatie> = {
adunare: (a, b) => a + b,
inmultire: (a, b) => a * b,
maxim: Math.max,
};
function aplica(f: Operatie, lista: number[]): number {
return lista.reduce((acc, x) => f(acc, x));
}
for (const [nume, f] of Object.entries(operatii)) {
console.log(nume, aplica(f, [3, 7, 2]));
}
Rezultat
adunare 12
inmultire 42
maxim 7
Exemplul 3: Argumente lipsă sau de tip greșit
function pretCuTva(pret: number, cota: number): number {
return pret * (1 + cota);
}
console.log(pretCuTva(10));
console.log(pretCuTva("10", 0.21));
Eroarea afișată de tsc
exemplu.mts(4,13): error TS2554: Expected 2 arguments, but got 1.
exemplu.mts(5,23): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.
Greșeli frecvente
- Lași parametrii fără tip. În modul strict este eroare (implicitly has an ‘any’ type); în modul ne-strict devin
anyși nu mai sunt verificați. - Uiți un
returnpe o ramură. Dacă ai scris tipul rezultatului, tsc spune Function lacks ending return statement; fără el, tipul devine în tăcerenumber | undefined.
Comenzi înrudite
arrow functions cu tipuri: Funcțiile săgeată primesc tipuri ca orice funcție; în callback-uri, tipul parametrilor se deduce din context.parametri opționali și impliciți: Un parametru cu ? poate lipsi la apel (devine undefined); unul cu = valoare primește valoarea implicită.rest parameters: Strâng oricâte argumente într-un tablou: …valori: number[] acceptă f(1), f(1, 2, 3) sau f().overload: Mai multe semnături pentru aceeași funcție, ca rezultatul să aibă tipul potrivit pentru fiecare fel de apel.generics (<T>): Parametri de tip: o funcție sau clasă scrisă o dată, care funcționează cu orice tip și păstrează tipul exact.void: Tipul returnat de funcțiile care nu întorc nicio valoare utilă, de exemplu cele care doar afișează ceva.