TypeScript中any和unknown有什么区别?

350 阅读1分钟

共同点

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

区别

不同点在于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 numberconsole.log(a.toLocaleLowerCase()) 
// [ERR]: a.toLocaleLowerCase is not a function