Mid #structural-typing#branded-types#excess-property
Structural typing là gì? Làm sao mô phỏng nominal typing (branded types)?
⚡ Trả lời nhanh
TypeScript dùng structural typing: hai type tương thích nếu cấu trúc khớp, bất kể tên. Vì vậy `UserId` và `OrderId` cùng là string vẫn đổi chỗ được. Excess property check chỉ áp dụng cho object literal trực tiếp. Muốn phân biệt thì dùng branded type (intersection với tag giả).
Ví dụ
main.ts · sửa được
- Type tương thích khi có đủ các property cần thiết với kiểu tương thích; thừa property thì vẫn được (trừ literal).
- Class có
private/protectedmember trở thành nominal: chỉ khớp với type có khai báo từ cùng class. - Brand chỉ tồn tại ở compile time (không có property
__brandthật ở runtime), nên hãy tạo qua hàm validate/constructor.