intersection (&) în TypeScript

Combină mai multe tipuri într-unul: A & B are toate proprietățile lui A și toate proprietățile lui B.

Sintaxă
type C = A & B;
function f(x: A & B) { ... }

Ce face intersection (&)

Un intersection, scris cu &, cere ca valoarea să fie în același timp de toate tipurile. Pentru obiecte, înseamnă că are proprietățile tuturor: Persoana & Contact are și nume, și email. Este felul în care aliasurile type „moștenesc”, echivalentul lui extends de la interfețe.

Este util când compui tipuri din bucăți mici refolosibile (CuId & CuData & Produs) sau când o funcție adaugă proprietăți unui obiect primit (T & { id: number }).

Dacă tipurile au aceeași proprietate cu tipuri incompatibile ({ id: number } & { id: string }), proprietatea devine never și niciun obiect nu se mai potrivește. Intersecția a două primitive diferite (string & number) este direct never.

Exemple

Exemplul 1: Tip compus din bucăți

type CuId = { id: number };
type CuData = { creatLa: string };
type Produs = { nume: string; pret: number };

type ProdusSalvat = CuId & CuData & Produs;

const p: ProdusSalvat = { id: 7, creatLa: "2026-10-19", nume: "Brânză de vaci", pret: 18.5 };
console.log(`#${p.id} ${p.nume}: ${p.pret} lei (adăugat ${p.creatLa})`);

Rezultat

#7 Brânză de vaci: 18.5 lei (adăugat 2026-10-19)

Exemplul 2: Funcție care adaugă o proprietate

Rezultatul are toate proprietățile obiectului primit plus id.

let urmatorulId = 1;
function cuId<T extends object>(obiect: T): T & { id: number } {
    return { ...obiect, id: urmatorulId++ };
}

const elev = cuId({ nume: "Ana", oras: "Iași" });
const oras = cuId({ nume: "Cluj", judet: "Cluj" });
console.log(elev.id, elev.nume, elev.oras);
console.log(oras.id, oras.judet);

Rezultat

1 Ana Iași
2 Cluj

Exemplul 3: Proprietate care lipsește din combinație

type Persoana = { nume: string };
type Contact = { email: string };
const c: Persoana & Contact = { nume: "Ana" };
console.log(c);

Eroarea afișată de tsc

exemplu.mts(3,7): error TS2322: Type '{ nume: string; }' is not assignable to type 'Persoana & Contact'.
  Property 'email' is missing in type '{ nume: string; }' but required in type 'Contact'.

Greșeli frecvente

  • Confunzi & cu |. A | B este „una dintre ele” (mai puține garanții), A & B este „amândouă” (mai multe proprietăți).
  • Combini tipuri cu proprietăți conflictuale și obții never fără nicio eroare la declarare. Cu interface extends conflictul ar fi semnalat.

Comenzi înrudite

  • union (|): Un tip care acceptă valori din mai multe tipuri: A | B înseamnă fie A, fie B.
  • type (alias de tip): Dă un nume oricărui tip: obiect, union, tuple, funcție sau un tip calculat din alte tipuri.
  • interface vs type: Când alegi interface și când type: pentru obiecte sunt aproape echivalente, dar au câteva diferențe importante.
  • generics (<T>): Parametri de tip: o funcție sau clasă scrisă o dată, care funcționează cu orice tip și păstrează tipul exact.