funcții cu tipuri în TypeScript

Funcții TypeScript 1.0

Pui tipuri pe parametrii și pe rezultatul funcțiilor; fiecare apel este verificat la compilare.

Sintaxă
function nume(a: Tip1, b: Tip2): TipRezultat { ... }
type F = (a: Tip1, b: Tip2) => TipRezultat;

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 return pe o ramură. Dacă ai scris tipul rezultatului, tsc spune Function lacks ending return statement; fără el, tipul devine în tăcere number | 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.