共同点
首先是二者的相同点:unknown
和any
都是顶层类型,也就是所有类型都可以赋值给unknown
和any
区别
不同点在于与any
相比,unknown
是更符合类型安全原则的,使用any
就意味着放弃了类型安全检查,此时你可以对一个any
类型的的变量进行任何操作,但如果这个变量是unknown
,你不能直接对它进行操作,因为unknown
此刻类型是未知的,直接操作可能会出错,需要unknown
进行类型收窄。
传统功夫是讲究
化劲儿
的,any
就是这样一股化劲儿
,哪里不通怼哪里,化劲儿
练到最后就可以将anyscript
修炼到大成,也就是纯正的Javascript
,即没有类型检查的阶段!
注意观察下面的例子:
使用 any 跳过了类型检查,不会报错;
1 | function sayMyName(callback: any) { |
同样是顶层类型,unknown 会有类型检查
1 | function sayMyName(callback: unknown) { |
虽然上述例子中,使用any
时不会爆出类型错误,但是最终运行代码时还是可能会报错,比如运行 sayMyName(1)
; 但 使用unknown
时,同样的代码,TS为我们指出了潜在的错误,这也是TypeScript
的初衷,因此说:**与
any相比,
unknown是更符合类型安全原则的
**。
对使用unknown
的情形进行类型收窄:
1 | function sayMyName(callback: unknown) { |
将unknown收窄到特定类型,就不会报错了。
也可以使用类型断言达到类似效果
1 | let res: unknown = 123 |