</>
⌕
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/protected member 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 __brand thật ở runtime), nên hãy tạo qua hàm validate/constructor.
🃏 Ôn bằng flashcard