0%

TS中any和unknown有什么区别

共同点

首先是二者的相同点:unknownany都是顶层类型,也就是所有类型都可以赋值给unknownany

区别

不同点在于any相比,unknown是更符合类型安全原则的,使用any就意味着放弃了类型安全检查,此时你可以对一个any类型的的变量进行任何操作,但如果这个变量是unknown,你不能直接对它进行操作,因为unknown此刻类型是未知的,直接操作可能会出错,需要unknown进行类型收窄

传统功夫是讲究化劲儿的,any就是这样一股化劲儿,哪里不通怼哪里,化劲儿练到最后就可以将anyscript修炼到大成,也就是纯正的Javascript,即没有类型检查的阶段!

注意观察下面的例子:

使用 any 跳过了类型检查,不会报错;

1
2
3
function sayMyName(callback: any) {
callback()
}

同样是顶层类型,unknown 会有类型检查

1
2
3
function sayMyName(callback: unknown) {
callback()
} //(parameter) callback: unknown Object is of type 'unknown'.

虽然上述例子中,使用any时不会爆出类型错误,但是最终运行代码时还是可能会报错,比如运行 sayMyName(1); 但 使用unknown时,同样的代码,TS为我们指出了潜在的错误,这也是TypeScript的初衷,因此说:**any相比,unknown是更符合类型安全原则的**。

对使用unknown的情形进行类型收窄:

1
2
3
4
5
function sayMyName(callback: unknown) {
if(typeof callback === 'function') {
callback()
}
}

将unknown收窄到特定类型,就不会报错了。

也可以使用类型断言达到类似效果

1
2
3
4
5
6
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