Un union (A | B) înseamnă "fie A sau B." Un intersection (A & B) înseamnă "atât A cât și B în același timp."
ts
// Union — value is one of several types
type Status = "loading" | "success" | "error"; // string literal union
let s: Status = "loading"; // only these three allowed
function id(x: string | number) { /* x is string OR number */ }
Lucrul cu unions: poți folosi doar ceea ce este comun
ts
function format(x: string | number) {
// x.toFixed(2); // ❌ toFixed doesn't exist on string
if (typeof x === "number") return x.toFixed(2); // ✅ narrowed to number
return x.toUpperCase(); // ✅ here it's a string
}
Până când restrângi un union, poți accesa doar membrii prezenți pe fiecare membru al union-ului — compilatorul te protejează.
Intersection — combină forme
ts
type Name = { name: string };
type Age = { age: number };
type Person = Name & Age; // must have BOTH name and age
const p: Person = { name: "Ann", age: 30 }; // both required
Intersection-urile sunt excelente pentru compunerea/mixarea tipurilor de obiecte (de ex. adăugarea props la un tip existent).
De ce conteaza
Union-urile modelează "una din mai multe posibilități" — baza modelării sigure a stării (de ex. discriminated unions pentru starea reducer-ului), supraîncărcări de funcții și tipuri nullable (T | null).
Intersection-urile compun tipuri împreună.
Impreună, ele fac sistemul de tipuri al TypeScript-ului suficient de expresiv pentru a oglindi datele reale cu precizie.
