TypeScript-聊聊any和unknown

158 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情

前言

TypeScript 中,anyunknown 都属于顶层类型,处于全部类型的顶点,可以说是包容了所有的类型,使用时总是容易弄混淆,本文重新梳理记录一下。

异同之处

相同

anyunknown 十分相似,都属于 top type,能够被赋值为任何类型,换句话,不论是numberstringArray 等任何类型,都可以赋值给这两个类型。

区别

虽然这两个类型一样能够接受任何类型的值,但是在使用上区别较大。

any 使用起来无所顾忌,可以看成是任何值,可以进行任何操作,不管 any 是不是需要的类型或者是否拥有对应的属性,在 any 上都可以直接使用或者是调用,不会报错。

简而言之,使用 any 类型,就是回到 JavaScript,不执行任何的类型检查。

但是 unknown 的使用就比较麻烦了,虽然是顶层类型,但是使用时依旧执行着类型限制,比如:

微信截图_20221006150835.png

unknownnumber 类型的 123 之间无法进行加法运算,会报错;例子中 unknownVal 本身是一个数字,也不能与 number 进行相加。

使用 unknown 类型的变量,需要先明确变量的类型,然后 TypeScript 会检测这个类型能够进行后续的运算或者操作;一般都是进行类型判断或者类型断言,如下:

微信截图_20221006151609.png

例子中,unknownVal 不论是断言为 string 或者通过 if 判断为 number 类型,都是能够和 123 进行加法运算,所以不会报错。

结论

在对 anyunknown 类型的变量赋值时,TypeScript 放弃了类型的检测,任何类型的值都可以赋值给这两个类型;

在使用时,any 依旧是放弃了类型的检测,但是 unknown 依旧保留了类型的检测,必须得明确变量的类型,才能够进行后续的操作。