Cả hai mô tả được hình dạng object và gần như thay thế nhau được, nên chọn theo khả năng riêng của từng loại chứ không theo sở thích.
Dùng interface khi:
- Mô tả object/class contract mà người khác có thể mở rộng — interface hỗ trợ declaration merging và extends.
- Public API của thư viện: consumer có thể augment thêm field mà không phải fork type.
Dùng type khi:
- Cần union, tuple, mapped type, conditional type, hoặc alias cho primitive — interface không làm được.
interface User { id: string; name: string }
type Status = 'idle' | 'loading' | 'error' // union: interface không viết được
type Pair = [number, number]Quy ước thực dụng hay dùng: mặc định interface cho object shape (props, entity, service contract), chuyển sang type ngay khi cần union hoặc phép biến đổi type.
Điểm khác biệt cần biết khi phỏng vấn: khai báo interface trùng tên hai lần sẽ gộp lại, còn type trùng tên là lỗi biên dịch — nên type an toàn hơn khi bạn muốn cấm mở rộng ngoài ý muốn.