Unia (A | B) oznacza "albo A lub B". Przecięcie (A & B) oznacza "zarówno A i B jednocześnie".
ts
= | | ;
: = ;
() { }
Unia (A | B) oznacza "albo A lub B". Przecięcie (A & B) oznacza "zarówno A i B jednocześnie".
= | | ;
: = ;
() { }
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
}
Dopóki nie zawęzisz unii, możesz uzyskać dostęp tylko do składowych obecnych na każdym elemencie unii — kompilator Cię chroni.
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
Przecięcia są doskonałe do komponowania/mieszania typów obiektów (np. dodawania właściwości do istniejącego typu).
Unie modelują "jedno z kilku możliwości" — fundamentem bezpiecznego modelowania stanu (np. dyskryminowane unie dla stanu reduktora), przeciążeń funkcji i typów nullable (T | null).
Przecięcia komponują typy razem.
Razem sprawiają, że system typów TypeScript jest wystarczająco ekspresyjny, aby precyzyjnie odzwierciedlać rzeczywiste dane.