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