一文搞懂 TypeScript 中的 ‘any‘ 和 ‘unknown‘ 类型

199 篇文章 2 订阅
订阅专栏
本文探讨了TypeScript中的any和unknown两种顶级类型,比较了它们的区别,强调了any的灵活性和unknown的类型安全性,以及如何在实际编程中正确使用它们以提升代码的可维护性和类型安全性。
摘要由CSDN通过智能技术生成

​掌握any类型和unknown类型之间的相似性和差异,避免把 TypeScript 当成 AnyScript 来学习。

当你第一次开始使用 TypeScript 时,你是否遇到过很多疯狂的问题,最终你用  any  技巧解决了它们?如果你以后不花时间学习 TypeScript 的类型系统,你可能会发现你把 TypeScript 当成了 AnyScript。

在 TypeScript 中, any  类型被称为顶级类型,所谓顶级类型可以理解为泛型父类型,即可以包含所有值的类型。

在 TypeScript 3.0 中,引入了新的顶级类型 —  unknown  类型,同样,你可以给未知类型的变量赋值。

那么现在问题来了, any  类型和  unknown 类型的区别是什么?any 类型可以理解为我不关心它的类型, unknown 类型可以理解为我不知道它的类型。

事实上,any 类型本质上是类型系统的逃生口,TypeScript允许我们对 any 类型的值执行任何操作,而无需执行任何类型的预先检查。

这有什么问题呢?让我们举个例子:

对于上面的 TypeScript 代码,编译时不会提示任何错误,但是在运行时会抛出运行时错误。作为开发者, any  类型给了我们很多自由,但它也带来了一些陷阱。为了解决  any  类型的安全风险,TypeScript 团队在 3.0 中引入了 unknown 类型,你可以理解为类型安全的  any  类型。

那么, unknown 类型在什么地方体现了类型安全呢?在这里,我们把  callWithErrorHandling  函数参数的类型改为  unknown  类型,然后 TypeScript 编译器会提示相应的错误消息:

相对于 any 类型,TypeScript对 unknown 类型的参数进行类型检查,以避免fn参数不是函数类型,为了解决上述问题,我们需要缩小fn参数的类型范围,即使用 typeof 操作符来确保fn参数是函数类型的对象:

在实践中,你还可以通过 instanceof 或用户定义的类型保护来缩小参数的类型范围:

declare function isFunction(x: unknown): x is Function;function fn(x: unknown) {    if (x instanceof Error) {        x;  // Error    }    if (isFunction(x)) {        x;  // Function    }}

与 any 类型不同,因为TypeScript对 unknown 类型的变量进行类型检查,当我们将上述代码中值变量的类型更改为 unknown 类型时,所有使用该值变量的语句都将失败。

此外,应该注意,unknown 类型的变量只能赋给 any 类型和 unknown 类型本身。
 

我们在之前的文章中已经介绍过 keyof 操作符和 mapped 类型。 any  类型和  unknown  类型在以下情况下表现不同:

type A0 = keyof any;  // string | number | symboltype U1 = keyof unknown;  // nevertype M2<T> = { [P in keyof T]: number };type M21 = M2<any>;  // { [x: string]: number }type M22 = M2<unknown>;  // {}

在上面的代码中,M2 类型被称为映射类型,在映射过程中,如果键类型为  never  类型,则当前键将被过滤掉,因此 M22 类型是一个空对象类型。

在工作中,为了保证类型安全,我们应该尽可能使用 unknown 类型,最后,让我们来看看 unknown 类型在不同类型下进行类型运算的结果:

 any  类型很特殊。当构造或与任何类型组合时,返回的是  any  类型。在阅读完本文后,我相信您已经理解了  any  类型和  unknown  类型之间的区别。您知道如何检测  any  类型和  unknown  类型吗?如果您知道,可以在评论部分提交您的答案。

 欢迎关注公众号:文本魔术,了解更多

TypeScript:any和unknown
风静如云的博客
01-25 1023
any: 可以用来指代typescript的任何类型,也就是说如果我们用any来定义一个变量的类型,那么可以给它赋值任何类型的值,并且对于它的方法和属性的访问也不会做类型检查 let data : any;//定义变量时如果没有制定类型如:let data;那么也是any类型 data = 'hello'; console.log(typeof data);//输出string console.log(data.length);//输出5 data = [1,2,3]; console.log(
ts总结2、any 类型unknown 类型,never 类型(编译选项noImplicitAny)
qq_33911541的博客
02-05 919
ts总结2、any 类型unknown 类型,never 类型(编译选项noImplicitAny)
TypeScript 基本用法、any、unknown、never、class、类型断言、数组、接口
最新发布
qq_44186810的博客
07-23 683
TypeScript 基本用法、any、unknown、never、class、类型断言、数组、接口
tstypeScript高阶:any和unknown
qq_48896417的博客
06-01 3626
typescript之any和unknown
TypeScript unknown 与 any 有啥区别
粉丝们务必加入微信粉丝群
10-22 299
作者:Ashish Lahoti 译者:前端小智 来源:dmitripavlutin 有梦想,有干货,微信搜索 【大迁世界】 关注这个在凌晨还在刷碗的刷碗智。 本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试完整考点、资料以及我的系列文章。 我们知道 any 类型的变量可以被赋给任何值。 let myVar: any = 0; myVar = '1'; myVar = false; TypeScript 指南并不鼓励使用 a.
TypeScript类型 : any,unknown,void,never,tuple
Allen的博客
01-13 1139
TypeScript类型 : any,unknown,void,never,tuple
TSTypeScript 的 any 与 unknown:理解与实践
鑫宝的博客
07-04 1578
any类型TypeScript最宽泛的类型,它可以代表任何值。当你给一个变量指定为any类型时,TypeScript编译器将不再进行类型检查,无论是赋值、调用方法还是访问属性。// 不会报错unknown类型同样是表示未知类型的值,但它采取了更为保守和安全的策略。当你声明一个变量为unknown时,除了赋值给同样为unknown的变量外,几乎无法直接对其进行操作,除非通过类型断言或类型守卫验证其具体类型。// 这是允许的// 错误,无法确定类型
TypeScript 之 any vs unknown
发果叁
06-16 1648
TypeScript 是对于 JavaScript 的超集,我们能通过 TypeScript 来发现编译时错误,以保证我们的代码是绝对安全的,而不是在运行时才来产生报错。但是 TypeScript 提供了一个 类型,这个类型可以跳过 类型检查器 的检查,轻松的实现 AnyScript在之后的版本当TypeScript 也发现了 的权利过于巨大,会产生很多的问题,“TS编译过不了怎么办,干any就完事了”,这种问题,所以在之后的版本,TypeScript 推出了 这个类型,那么 和 有什么不同的
【JavaScript源代码】一文搞懂TypeScript的安装、使用、自动编译的教程.docx
12-29
TypeScript的主要特点是提供了类型系统和对ES6及更高版本的支持,旨在帮助开发者在大型应用开发提高代码质量和可维护性。 TypeScript的三大特点包括: 1. **始于JavaScript,归于JavaScript**:TypeScript编译成...
搞懂 TypeScript 的映射类型(Mapped Types)
pingan8787
04-17 1383
本文从数学的映射作为切入点,详细介绍 TypeScript 映射类型(Mapped Type)并介绍映射类型的应用和修饰符的应用。
停止在 TypeScript 使用“any”类型
weixin_41422591的博客
06-25 1200
本文讨论了何时应该和不应该使用 any 类型,并附上了示例,以便让您更好地理解。我希望您能利用这些建议让您的 TypeScript 项目变得更好。
Typescript - any / unknown 类型及二者区别(详细入门教程)
王佳斌
02-09 2834
TypeScript 的任何 any 和 unknown 类型typescriptany与unknown的区别,TypeScript的顶级类型:any和unknown一文帮你搞懂typescriptunknown与any,TypeScript any 和 unknown 的区别,详细聊聊TypeScriptunknown与any的区别,Typescript any、unknowntypescript - 如何理解类型 any、unknownTypeScript unknown类型,Typ
学习 TypeScript2 (任意类型any, unknown
LiangHui0914的博客
10-21 432
学习 TypeScript2 (任意类型any, unknown
unkown类型
weixin_30602505的博客
08-08 1503
1,任何类型的值都可以赋给unkown类型 2. 如果没有类型断言或基于控制流的类型细化时 unknown 不可以赋值给其它类型,此时它只能赋值给 unknown 和 any 类型 3. 如果没有类型断言或基于控制流的类型细化,则不能在它上面进行任何操作 4.unknown 与任何其它类型组成的交叉类型,最后都等于其它类型、 5.unknown 与任何其它类型组成的联合类型,都...
[译] TypeScript 3.0: unknown 类型
热门推荐
weixin_33716557的博客
06-15 1万+
原文地址:TypeScript 3.0: The unknown Type 原文作者:Marius Schulz 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m… 译者:shixi-li 校对者:Usey95, smilemuffie TypeScript 3.0 引入了新的unknown 类型,它是 any 类型对应的安全类型unknown 和 a...
typescript any和unknown,never曲笔
weixin_35757191的博客
01-04 88
好的。 TypeScript 的 any 类型表示一个可以是任何类型的值。它可以用于避免类型检查,或者在你还没有确定类型的情况下使用。但是,使用 any 类型会放弃 TypeScript 带来的类型检查的所有优势,因此在能使用更精确类型的地方应尽量避免使用 any。 TypeScript unknown 类型表示一个未知的类型。它比 any 类型更加严格,因为在使用前需要进行类型检查。在某...
Typescriptany和unknown的区别?
stay hungry, stay foolish
04-09 1438
因此,any 和 unknown 的主要区别在于类型检查的严格程度。any 允许对其进行任意操作,而 unknown 需要进行类型检查或类型断言后才能进行操作,从而提供了更强的类型安全性。在使用时,应尽量避免过度使用 any 类型,而是在可能的情况下使用 unknown 类型,并在需要时进行类型检查和类型断言,以提高代码的类型安全性。
any,和unknown的区别
sifeiwl的博客
04-03 1192
any和unkonwn 可以是任何类的父类,所以任何类型的变量都可以赋值给any类型unknown类型的变量。一般用作函数参数 用来接收任意类型的变量实参 但在函数内部只用于再次传递或输出结果,不获取属性的场景。比如说后端的数据传到前端后类型就变成了any 此时就可以利用any来给数据定义类型比如。自定义守卫 需要进行as any类型断言的场景。
any与unknown的区别
linanran1027的博客
12-02 623
any和unknown的主要区别在于类型检查的严格程度。any允许对其进行任意操作,而unknown需要进行类型检查或类型断言后才能进行操作,从而避免了any类型污染问题,提供了更强的类型安全性。在使用时,应尽量使用unknown类型代替any类型,并在需要时进行类型检查和类型断言,以提高代码的类型安全性。
写文章

热门文章

  • lftp下载文件无法覆盖,提示" file already existst and xfer:clobber is unset" 问题解决 7104
  • 浏览器自定义脚本管理插件系列介绍(一):暴力猴(ViolentMonkey) 6436
  • 如何查看网站文件存放目录 5225
  • 编写第二个油猴脚本,实现给greasyfork增加代码复制按钮 5148
  • 如何在TypeScript中正确定义Window类型 4451

分类专栏

  • 公众号 199篇

最新评论

  • 修复LogicFlow拖拽创建节点时,报 Cannot read properties of undefined (reading ‘model‘) 错误的问题

    清晰编程: 很高兴能帮到你

  • 修复LogicFlow拖拽创建节点时,报 Cannot read properties of undefined (reading ‘model‘) 错误的问题

    m0_60595550: 超级谢谢终于解决了!

  • 现代前端架构介绍(第二部分):如何将功能架构分为三层

    普通网友: 大佬的文章写的太精辟了 让我深刻了解了这篇文章的精髓 谢谢大佬分享,希望继续创作优质博文。【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

  • 现代前端架构介绍(第三部分):深入了解状态管理层及其对前端App的影响

    普通网友: 写的很详细,感谢博主的分享。【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

  • 现代前端架构介绍(第一部分):App是如何由不同的构建块构成的

    普通网友: 文章结构严谨有条,层次分明,读起来一点也不费劲,让人受益匪浅。【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

最新文章

  • 用通义灵码解决了用npm link安装的模块在vscode中不能被识别到的问题
  • 现代前端架构介绍(第三部分):深入了解状态管理层及其对前端App的影响
  • 现代前端架构介绍(第二部分):如何将功能架构分为三层
2024
10月 1篇
08月 3篇
07月 1篇
06月 5篇
05月 4篇
04月 4篇
02月 46篇
01月 56篇
2023年45篇
2014年9篇
2011年28篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家湖北户内玻璃钢雕塑多少钱江西步行街玻璃钢雕塑市场玻璃钢雕塑设计价格表深圳厂家玻璃钢雕塑资讯华阴玻璃钢伟人像雕塑泰州小鸡玻璃钢花盆常见商场美陈生产企业河北玻璃钢小品雕塑维修翻新武汉河源玻璃钢人物雕塑厂家组合式玻璃钢雕塑摆件定制玻璃钢乐园雕塑玻璃钢红军雕塑出售玻璃钢雕塑哪里买好点汝州玻璃钢雕塑费用巩义玻璃钢雕塑设计玻璃钢虎雕塑平顶山仿古校园玻璃钢雕塑公司湖南玻璃钢人物雕塑价格范围福建玻璃钢动物雕塑制作徐州玻璃钢座椅雕塑新郑标识校园玻璃钢景观雕塑玻璃钢花盆透气吗精美的玻璃钢山羊雕塑玉溪玻璃钢雕塑金华荷花玻璃钢雕塑镂空玻璃钢大象雕塑绍兴主题商场美陈商场美陈定制山东户外商场美陈报价优惠的玻璃钢雕塑设计香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化