介绍
unknown 是 TypeScript 3.0 引入了新类型,是 any 类型对应的安全类型。
| 相同点 | let value: any | let value: unknown | 
|---|---|---|
| value = true; | OK | OK | 
| value = 1; | OK | OK | 
| value = "Hello World"; | OK | OK | 
| value = Symbol("type"); | OK | OK | 
| value = {} | OK | OK | 
| value = [] | OK | OK | 
unknown 和 any 的主要区别是 unknown 类型会更加严格: 在对unknown类型的值执行大多数操作之前,我们必须进行某种形式的检查, 而在对 any 类型的值执行操作之前,我们不必进行任何检查。
当 unknown 类型被确定是某个类型之前,它不能被进行任何操作
| 不同点 | let value: any | let value: unknown | 
|---|---|---|
| value.foo.bar; | OK | ERROR | 
| value(); | OK | ERROR | 
| new value(); | OK | ERROR | 
| value[0][1]; | OK | ERROR | 
例子
有这么一个函数
function divide(param: any) {
  return param / 2;
}
把 param 定义为 any 类型,TS 就能编译通过,没有把潜在的风险暴露出来,万一传的不是 number 类型,不就没有达到预期了吗。
把 param 定义为 unknown 类型 ,TS 编译器就能拦住潜在风险,如下图:
因为不知道 param 的类型,使用运算符 /,导致报错。
再配合类型断言,即可解决这个问题,
function divide(param: unknown) {
  return param as number / 2;
}