tuple în TypeScript

Tipuri de bază TypeScript 1.3

Un tablou cu număr fix de elemente, în care fiecare poziție are tipul ei, de exemplu [nume, notă].

Sintaxă
let p: [string, number] = ["Ana", 9];
type Punct = [x: number, y: number];
type T = [string, number?];         // element opțional
type U = [string, ...number[]];     // rest

Ce face tuple

Un tuple este un tablou cu o structură fixă: [string, number] are exact două elemente, primul text, al doilea număr. Este util când o funcție returnează mai multe valori (ca useState din React) sau pentru perechi cheie-valoare (Object.entries returnează [string, T][]).

Pozițiile pot avea nume, care apar în editor și fac codul mai clar: [x: number, y: number]. Un element poate fi opțional (number?, doar la final), iar ...number[] înseamnă „oricâte numere de aici încolo”.

Un tuple poate fi readonly: readonly [number, number]. as const pe un tablou literal produce un tuple readonly cu valori exacte.

Exemple

Exemplul 1: Funcție care returnează două valori

Destructurarea dă fiecărei variabile tipul poziției ei.

function minMax(note: number[]): [min: number, max: number] {
    return [Math.min(...note), Math.max(...note)];
}

const [min, max] = minMax([7, 10, 8, 9]);
console.log(`minim ${min}, maxim ${max}`);

const perechi: [string, number][] = [["Ana", 9], ["Mihai", 7]];
for (const [nume, nota] of perechi) console.log(nume.padEnd(6), nota);

Rezultat

minim 7, maxim 10
Ana    9
Mihai  7

Exemplul 2: Elemente opționale și rest

type Adresa = [oras: string, strada: string, numar?: number];
type Clasa = [diriginte: string, ...elevi: string[]];

const a1: Adresa = ["Iași", "Lăpușneanu", 12];
const a2: Adresa = ["Cluj", "Memorandumului"];
const clasa: Clasa = ["prof. Ionescu", "Ana", "Mihai", "Ioana"];

console.log(a1.length, a2.length, a2[2]);
console.log(`${clasa[0]} are ${clasa.length - 1} elevi`);

Rezultat

3 2 undefined
prof. Ionescu are 3 elevi

Exemplul 3: Poziții inversate

const elev: [string, number] = [9, "Ana"];
console.log(elev);

Eroarea afișată de tsc

exemplu.mts(1,33): error TS2322: Type 'number' is not assignable to type 'string'.
exemplu.mts(1,36): error TS2322: Type 'string' is not assignable to type 'number'.

Greșeli frecvente

  • Faci push pe un tuple ne-readonly: tsc îl permite, deși strică structura. Marchează tuple-ul readonly.
  • Folosești un tuple lung ([string, string, number, boolean]) unde un obiect cu nume de proprietăți ar fi mai clar.

Comenzi înrudite

  • array (T[] și Array<T>): Tipul tablourilor: T[] și Array<T> înseamnă același lucru, un tablou cu elemente de tipul T.
  • as const: Face un literal complet readonly și păstrează valorile exacte ca tipuri: „Iași” în loc de string.
  • rest parameters: Strâng oricâte argumente într-un tablou: …valori: number[] acceptă f(1), f(1, 2, 3) sau f().
  • readonly: Marchează o proprietate care primește valoare o singură dată și nu mai poate fi modificată după aceea.