Cả hai đều có thể chứa bất kỳ giá trị nào, nhưng chúng khác nhau về độ an toàn. any tắt việc kiểm tra type; unknown giữ việc kiểm tra bật và buộc bạn phải narrow trước khi sử dụng.
ts
: = ;
a..;
();
: = ;
u.();
();
Cả hai đều có thể chứa bất kỳ giá trị nào, nhưng chúng khác nhau về độ an toàn. any tắt việc kiểm tra type; unknown giữ việc kiểm tra bật và buộc bạn phải narrow trước khi sử dụng.
: = ;
a..;
();
: = ;
u.();
();
function handle(input: unknown) {
if (typeof input === "string") {
input.toUpperCase(); // ✅ bên trong guard, TS biết nó là string
}
}
unknown là phiên bản type-safe của any: bạn có thể gán bất cứ thứ gì vào nó, nhưng không thể làm gì với nó cho đến khi bạn chứng minh được nó là gì thông qua một type guard.
unknown — cho các giá trị thực sự không rõ type tại ranh giới (boundary): kết quả của JSON.parse, response từ API, catch (e: unknown). Nó buộc phải validate.any — lối thoát hiểm khi đang migrate từ JS hoặc khi bạn thực sự không thể type được thứ gì đó. Dùng dè dặt; nó lan rộng âm thầm và vô hiệu hóa độ an toàn.Việc dùng any đánh bại mục đích của TypeScript.
Hãy ưu tiên unknown tại các boundary không có type — nó giữ được những đảm bảo của compiler trong khi vẫn chấp nhận đầu vào bất kỳ, thúc đẩy bạn validate dữ liệu trước khi tin tưởng nó.