两者都可以保存任何值,但在安全性上有所不同。any 关闭类型检查;unknown 保持类型检查并强制在使用前进行类型缩小。
ts
: = ;
a..;
();
: = ;
u.();
();
function handle(input: unknown) {
if (typeof input === "string") {
input.toUpperCase(); // ✅ inside the guard, TS knows it's a string
}
}
unknown 是 any 的类型安全对应物:你可以向它赋予任何值,但直到你通过类型保护证明它是什么,才能对其进行任何操作。
unknown — 用于边界处类型完全未知的值:JSON.parse 结果、API 响应、catch (e: unknown)。它强制进行验证。any — 当迁移 JS 或确实无法对某些内容进行类型化时的逃脱出口。使用要谨慎;它会默默传播并禁用安全保障。求助于 any 会破坏 TypeScript 的目的。
在无类型的边界处优先使用 unknown — 它保持编译器的保证,同时仍然接受任意输入,促使你在信任数据前验证数据。