两者都可以保存任何值,但在安全性上有所不同。any 关闭类型检查;unknown 保持类型检查并强制在使用前进行类型缩小。
ts
let a: any = "hello";
a.foo.bar; // ✅ compiles — no checking at all (may crash at runtime)
a(); // ✅ compiles — TypeScript trusts you blindly
let u: unknown = "hello";
u.toUpperCase(); // ❌ Error: object is of type 'unknown'
u(); // ❌ Error — must narrow first
unknown 强制在使用前进行检查
ts
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 — 它保持编译器的保证,同时仍然接受任意输入,促使你在信任数据前验证数据。
