res.json() trả về Promise<any>, và as User không kiểm tra gì ở runtime — nó chỉ nói với compiler "cứ tin tôi".
Nếu backend đổi field hoặc trả về lỗi, code vẫn biên dịch sạch rồi hỏng ở nơi khác, xa điểm gây lỗi.
const user = await res.json() as User
console.log(user.profile.name) // biên dịch OK, runtime có thể TypeErrorBa mức xử lý, tăng dần độ chắc chắn:
1. Nhận về unknown thay vì any để compiler bắt buộc bạn kiểm tra trước khi dùng.
2. Viết type guard cho các field thực sự đọc tới:
function isUser(v: unknown): v is User {
return typeof v === 'object' && v !== null && 'id' in v
}3. Dùng schema validation (Zod, Valibot) khi payload phức tạp — parse một lần ở ranh giới mạng, phần còn lại của ứng dụng nhận kiểu đã được bảo đảm.
Điểm chốt cần nói khi phỏng vấn: TypeScript chỉ tồn tại lúc biên dịch. Dữ liệu đi qua ranh giới hệ thống (HTTP, localStorage, postMessage) phải được kiểm tra ở runtime, as không thay thế được việc đó.