在 TypeScript 中,unknown
是一个特殊的类型,用于表示 "类型未知但存在" 的值。它是 TypeScript 类型系统的顶层类型之一,提供了一种更安全的替代 any
的方式。
核心特性
-
类型安全:
- 与
any
不同,unknown
不允许直接进行任何操作(例如访问属性、调用方法),必须先通过 类型断言 或 类型守卫 明确其具体类型。 - 强制开发者显式处理类型不确定性,减少运行时错误。
- 与
-
兼容性:
unknown
可以接受任意类型的赋值(类似any
)。- 但
unknown
类型的变量只能赋值给unknown
或any
,除非经过类型缩小。
使用场景
-
处理动态数据
例如解析 JSON 或第三方 API 响应,数据的具体结构未知:
typescriptfunction parseJSON(jsonString: string): unknown { return JSON.parse(jsonString); } const data = parseJSON('{"name": "Alice", "age": 30}'); if (data && typeof data === 'object' && 'name' in data) { console.log(data.name); // 通过类型守卫后安全访问 }
-
函数参数类型约束
需要接受任意类型参数,但内部进行类型检查:
typescriptfunction safeToString(value: unknown): string { if (typeof value === 'string') return value; return String(value); }
-
联合类型中的占位符
当某个值的类型可能是多种可能性时:
typescripttype Result = number | unknown;
类型缩小(Type Narrowing)
使用 unknown
时,使用 typeof
、instanceof
或自定义类型守卫,逐步缩小类型范围:
typescript
function handleInput(input: unknown) {
if (typeof input === 'string') {
// 此时 input 被推断为 string
console.log(input.toUpperCase());
} else if (Array.isArray(input)) {
// 此时 input 被推断为 any[]
console.log(input.length);
}
}
与 any
的对比
特性 | unknown |
any |
---|---|---|
类型安全 | ✅ 必须显式类型检查 | ❌ 绕过所有类型检查 |
可赋值性 | 只能赋给 unknown 或 any |
可赋给任意类型 |
默认操作限制 | 无法直接访问属性/方法 | 允许任意操作(可能引发错误) |
最佳实践
-
优先使用
unknown
替代any
unknown
强制类型检查,避免无意中绕过 TypeScript 的类型系统。 -
谨慎使用类型断言
仅在确保类型安全时使用
as
:typescriptconst userInput: unknown = 'Hello'; const str = userInput as string; // 确保 userInput 确实是 string