rest parameters în TypeScript

Funcții TypeScript 1.0

Strâng oricâte argumente într-un tablou: ...valori: number[] acceptă f(1), f(1, 2, 3) sau f().

Sintaxă
function f(...valori: number[]) { ... }
function g(prim: string, ...rest: [number, boolean]) { ... }

Ce face rest parameters

Un rest parameter se scrie cu trei puncte în fața numelui și strânge toate argumentele rămase într-un tablou. Tipul lui este un tablou (number[]) sau un tuple, dacă vrei un număr fix de argumente cu tipuri diferite. Trebuie să fie ultimul parametru.

La apel, poți „desface” un tablou în argumente cu aceleași trei puncte: suma(...note). TypeScript verifică tipul elementelor. Dacă funcția așteaptă un tuple, tabloul trebuie să aibă tipul tuple (de exemplu marcat cu as const), nu un simplu number[].

Tipurile utilitare Parameters și rest parameters se combină des: (...args: Parameters<typeof f>) creează o funcție cu exact aceiași parametri ca f.

Exemple

Exemplul 1: Oricâte numere

function medie(...note: number[]): number {
    if (note.length === 0) return 0;
    return note.reduce((s, n) => s + n, 0) / note.length;
}

console.log(medie(9, 10));
console.log(medie(7, 8, 9, 10).toFixed(2));
console.log(medie());

const noteAna = [10, 9, 9];
console.log(medie(...noteAna).toFixed(2));

Rezultat

9.5
8.50
0
9.33

Exemplul 2: Parametru obligatoriu urmat de rest

function anunta(clasa: string, ...elevi: string[]): string {
    return `${clasa}: ${elevi.length} elevi (${elevi.join(", ")})`;
}

console.log(anunta("a IX-a A", "Ana", "Mihai", "Ioana"));
console.log(anunta("a X-a B"));

Rezultat

a IX-a A: 3 elevi (Ana, Mihai, Ioana)
a X-a B: 0 elevi ()

Exemplul 3: Rest cu tuple și tabloul de tip greșit

Funcția așteaptă exact un text și un număr. Un (string | number)[] nu garantează asta.

function nota(materie: string, valoare: number): string {
    return `${materie}: ${valoare}`;
}
const date = ["matematică", 9];
console.log(nota(...date));

Eroarea afișată de tsc

exemplu.mts(5,18): error TS2556: A spread argument must either have a tuple type or be passed to a rest parameter.

Greșeli frecvente

  • Pui rest parameter înaintea altor parametri. tsc dă A rest parameter must be last in a parameter list.
  • Desfaci un tablou obișnuit într-o funcție cu parametri ficși. Declară tabloul ca tuple (as const sau [string, number]).

Comenzi înrudite

  • funcții cu tipuri: Pui tipuri pe parametrii și pe rezultatul funcțiilor; fiecare apel este verificat la compilare.
  • tuple: Un tablou cu număr fix de elemente, în care fiecare poziție are tipul ei, de exemplu [nume, notă].
  • Parameters: Parameters<F> dă tipurile parametrilor unei funcții, ca tuple; Parameters<F>[0] este primul parametru.
  • parametri opționali și impliciți: Un parametru cu ? poate lipsi la apel (devine undefined); unul cu = valoare primește valoarea implicită.