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 = numberte protejează de amestecarea cuEuro. Pentru asta e nevoie de un tip „marcat” (number & { __moneda: "lei" }). - Încerci să adaugi proprietăți unui
typedeclarâ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.