type (alias de tip) în TypeScript

Dă un nume oricărui tip: obiect, union, tuple, funcție sau un tip calculat din alte tipuri.

Sintaxă
type Nume = Tip;
type Id = number | string;
type Punct = { x: number; y: number };
type Functie = (a: number) => string;

Ce face type (alias de tip)

type creează un alias, adică un nume nou pentru un tip. Spre deosebire de interface, care descrie doar obiecte, un alias poate numi orice: un union ("da" | "nu"), un tuple, tipul unei funcții, un tip primitiv sau un tip construit din altele cu mapped types și conditional types.

Aliasul nu creează un tip nou: type Lei = number este tot number, iar o variabilă Lei acceptă orice număr. Folosește aliasurile ca să dai sens tipurilor și ca să nu repeți tipuri lungi.

Pentru obiecte poți combina aliasuri cu & (intersection), în timp ce interfețele folosesc extends. Un alias poate fi generic (type Lista<T> = T[]) și chiar recursiv (se referă la el însuși).

Exemple

Exemplul 1: Aliasuri pentru tipuri diferite

type Id = number | string;
type Punct = { x: number; y: number };
type Formatare = (suma: number) => string;
type Pereche<T> = [T, T];

const id1: Id = 42;
const id2: Id = "RO-7";
const p: Punct = { x: 3, y: 4 };
const lei: Formatare = (suma) => `${suma.toFixed(2)} lei`;
const interval: Pereche<number> = [8, 16];

console.log(id1, id2, Math.hypot(p.x, p.y), lei(12.5), interval);

Rezultat

42 RO-7 5 12.50 lei [ 8, 16 ]

Exemplul 2: Alias recursiv: un arbore de categorii

Categorie conține o listă de Categorie. Funcția parcurge arborele și afișează fiecare nivel indentat.

type Categorie = {
    nume: string;
    sub: Categorie[];
};

const meniu: Categorie = {
    nume: "Produse",
    sub: [
        { nume: "Lactate", sub: [{ nume: "Brânză", sub: [] }] },
        { nume: "Panificație", sub: [] },
    ],
};

function afiseaza(c: Categorie, nivel = 0): void {
    console.log("  ".repeat(nivel) + c.nume);
    for (const s of c.sub) afiseaza(s, nivel + 1);
}
afiseaza(meniu);

Rezultat

Produse
  Lactate
    Brânză
  Panificație

Exemplul 3: Un alias nu face tipurile incompatibile

Lei și Euro sunt amândouă number, deci pot fi amestecate fără eroare. Aliasul ajută cititorul, nu verificarea.

type Lei = number;
type Euro = number;

const pretLei: Lei = 50;
const pretEuro: Euro = pretLei;   // permis: ambele sunt number
console.log(pretEuro);

Rezultat

50

Greșeli frecvente

  • Crezi că type Lei = number te protejează de amestecarea cu Euro. Pentru asta e nevoie de un tip „marcat” (number & { __moneda: "lei" }).
  • Încerci să adaugi proprietăți unui type declarând-l a doua oară. Aliasurile nu se unesc ca interfețele: tsc dă Duplicate identifier.

Comenzi înrudite

  • interface: Descrie forma unui obiect: ce proprietăți are, de ce tip sunt și ce metode are.
  • interface vs type: Când alegi interface și când type: pentru obiecte sunt aproape echivalente, dar au câteva diferențe importante.
  • union (|): Un tip care acceptă valori din mai multe tipuri: A | B înseamnă fie A, fie B.
  • intersection (&): Combină mai multe tipuri într-unul: A & B are toate proprietățile lui A și toate proprietățile lui B.
  • generics (<T>): Parametri de tip: o funcție sau clasă scrisă o dată, care funcționează cu orice tip și păstrează tipul exact.