Một union (A | B) nghĩa là "A hoặc B." Một intersection (A & B) nghĩa là "cả A và B cùng một lúc."
ts
= | | ;
: = ;
() { }
Một union (A | B) nghĩa là "A hoặc B." Một intersection (A & B) nghĩa là "cả A và B cùng một lúc."
= | | ;
: = ;
() { }
function format(x: string | number) {
// x.toFixed(2); // ❌ toFixed không tồn tại trên string
if (typeof x === "number") return x.toFixed(2); // ✅ đã narrow thành number
return x.toUpperCase(); // ✅ ở đây nó là string
}
Cho đến khi bạn narrow một union, bạn chỉ có thể truy cập các thành viên có mặt trên mọi thành viên của union — compiler bảo vệ bạn.
type Name = { name: string };
type Age = { age: number };
type Person = Name & Age; // phải có CẢ name và age
const p: Person = { name: "Ann", age: 30 }; // cả hai đều bắt buộc
Intersection rất tốt để kết hợp/trộn các object type (ví dụ: thêm property vào một type hiện có).
Union mô hình hóa "một trong nhiều khả năng" — nền tảng của việc mô hình hóa trạng thái an toàn (ví dụ: discriminated union cho trạng thái reducer), function overload, và các nullable type (T | null).
Intersection kết hợp các type lại với nhau.
Cùng nhau, chúng làm cho hệ thống type của TypeScript đủ giàu biểu đạt để phản ánh chính xác dữ liệu thực tế.