A | B là hoặc, A & B là và.
typescript
type Id = string | number // union: một trong hai
type Admin = User & { role: 'admin' } // intersection: có đủ cả haiĐiểm hay nhầm — union thu hẹp cái dùng được, intersection mở rộng:
typescript
type A = { a: string; shared: string }
type B = { b: number; shared: string }
const u: A | B = getSomething()
u.shared // OK — thuộc tính CHUNG mới truy cập được
u.a // Lỗi: không chắc là A hay B
const i: A & B = { a: 'x', b: 1, shared: 's' }
i.a; i.b // OK — có tất cảMuốn dùng thuộc tính riêng của union thì phải thu hẹp kiểu trước (typeof, in, discriminated union).
Hai đặc điểm của intersection hay bị hỏi:
typescript
type Never = string & number // never — không giá trị nào vừa là string vừa là number
type C = { x: string } & { x: number }
// x có kiểu never — không thể tạo được object hợp lệLưu ý: intersection nhiều interface lớn khiến thông báo lỗi của TypeScript rất dài và khó đọc.
Khi mô tả "đối tượng có thêm thuộc tính", interface X extends Y cho thông báo lỗi rõ hơn type X = Y & {...}.