第 215 题:TypeScript 中 any、never、unknown 和 void 有什么区别?
any 在任意值上访问任何属性都是允许的,使用 any 相当于彻底放弃了类型检查,在使用上就没有任何代码提示和错误。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
any 在任意值上访问任何属性都是允许的,使用 any 相当于彻底放弃了类型检查,在使用上就没有任何代码提示和错误。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(1)
any、unknown、never、void
any
any
类型用于描述一个我们根本不知道类型的变量,或者说可以是任意类型的变量,不作任何约束,编译时会跳过对其的类型检查unknown
unknown
表示未知类型,即写代码的时候还不知道具体会是怎样的数据类型,是typescript 3.0
中引入的新类型, 与any
类似,所有类型都可以分配给unknown
类型但与
any
不同的是,unknown
类型的变量不允许被any
或unknown
以外的变量赋值,也不允许执行unknown
类型变量的方法这种限制有很强的防御性,但如果我们要对未知类型执行某些操作,也不是没有办法
方式一:使用类型断言缩小未知范围
方式二:使用类型守卫进行类型收缩
我们仅在
notSure
为string
类型时,才执行toLowerCase
方法,TypeScript 编译器会理解这一点,并假设类型never
never
,永不存在的值的类型,是 typescript 2.0 中引入的新类型,那什么是永不存在的类型,我们知道变量一旦声明,都会默认初始化为undefined
,也不是永不存在的值,但其实有一些场景,值会永不存在,例如,那些总是会抛出异常或函数中执行无限循环的代码(死循环)的函数返回值类型变量也可以声明为
never
类型,因为它是永不存在值的类型,所以任何类型都不能赋值给never
类型(除了never
本身之外)。 即使any
也不可以赋值给never
void
void
某种程度上来说正好与any
相反,表示无任何类型,没有类型,如果是函数则应没有返回值或者返回undefined
:也可以声明一个
void
类型的变量,不过你只能为它赋予undefined
、null
(注意,"strictNullChecks": true
时会报错)和void
类型的值any、unknown、never、void 区别
1. 定义
any
:用于描述任意类型的变量,不作任何约束,编译时会跳过对其的类型检查unknown
:表示未知类型,即写代码的时候还不知道具体会是怎样的数据类型never
:永不存在的值的类型,常用于表示永不能执行到终点的函数返回值,例如抛出异常或函数中执行无限循环的代码(死循环)的函数返回值类型void
:表示无任何类型,没有类型,例如没有返回值的函数的返回值类型any 与 unknown 的区别:
unknown
与any
类似,但使用前必须进行断言或守卫never 与 void 的区别:
用于函数时,
never
表示函数用于执行不到返回值那一步(抛出异常或死循环)的返回值类型,即永不存在的值的类型,而void
则表示没有返回值,不返回或返回undefined
2. 使用
any
类型导致问题太多了,如类型污染,使用不存在的属性或方法而不报错等,而且不不方便后期维护,所以,建议能不用any
就不用any
,但是如果声明时并不确定具体的类型,则可以使用unknown
代替,在使用时用类型断言或类型守卫进行类型收缩never
类型用于表示永不存在的值的类型,所以常用于构造条件类型来组合出更灵活的类型定义void
常用于表示函数没有返回值原文