作者:Ashish Lahoti
译者:前端小智
起源:dmitripavlutin
有幻想,有干货,微信搜寻 【大迁世界】 关注这个在凌晨还在刷碗的刷碗智。
本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试残缺考点、材料以及我的系列文章。
咱们晓得 any
类型的变量能够被赋给任何值。
let myVar: any = 0;
myVar = '1';
myVar = false;
TypeScript 指南并不激励应用 any
,因为应用它就会丢掉类型限度 – 而须要类型限度也是咱们抉择 TypeScript 的一个起因,所以就是有点南辕北辙。
TypeScript(3.0 及以上版本)还提供了一种相似于 any
的非凡类型 unknown
。咱们也能够为 unknown
类型变量调配任何值:
let myVar: unknown = 0;
myVar = '1';
myVar = false;
那当初就有一个问题了,any
和 unknown
有啥区别?
1. unknown vs any
为了更好地了解 unknown
和 any
之间的区别,咱们先从编写一个想要调用其惟一参数的函数开始。
咱们将 invokeAnything()
的惟一参数设置为 any
类型
function invokeAnything(callback: any) {callback();
}
invokeAnything(1); // throws "TypeError: callback is not a function"
因为 callback
参数是任何类型的,所以语句 callback()
不会触发类型谬误。咱们能够用any
类型的变量做任何事件。
然而运行会抛出一个运行时谬误:TypeError: callback is not a function
。1
是一个数字,不能作为函数调用,TypeScript 并没有爱护代码防止这个谬误
那既容许 invokeAnything()
函数承受任何类型的参数,又要强制对该参数进行类型查看避免下面这种报错,要怎么做呢?
有请 unknown
大哥来控场。
与 any
一样,unknown
变量承受任何值。然而当尝试应用 unknown
变量时,TypeScript 会强制执行类型查看。这不就是咱们想要的嘛。
function invokeAnything(callback: unknown) {callback();
// Object is of type 'unknown'
}
invokeAnything(1);
因为 callback
参数的类型是 unknown
,所以语句 callback()
有一个类型谬误 :Object is of type 'unknown'
。与 any
相同,TypeScript 会爱护咱们不调用可能不是函数的货色。
在应用一个 unknown
类型的变量之前,你须要进行类型查看。在这个例子中,咱们只须要查看callback
是否是一个函数类型。
function invokeAnything(callback: unknown) {if (typeof callback === 'function') {callback();
}
}
invokeAnything(1);
2. unknown 和 any 的心智模式
说实话,当我学习的时候,我很难了解 unknown
。它与 any
有什么不同,因为这两种类型都承受任何值
上面是帮忙我了解两者区别的规定:
- 能够将任何货色赋给
unknown
类型,但在进行类型查看或类型断言之前,不能对unknown
进行操作 - 能够把任何货色调配给
any
类型,也能够对any
类型进行任何操作
下面的例子正好阐明了 unknown
和 `any 之间的类似和不同。
unknown
示例:
function invokeAnything(callback: unknown) {
// 能够将任何货色赋给 `unknown` 类型,// 但在进行类型查看或类型断言之前,不能对 `unknown` 进行操作
if (typeof callback === 'function') {callback();
}
}
invokeAnything(1); // You can assign anything to `unknown` type
类型查看 typeof callback === 'function'
,查看 callback
是否为函数,如果是,则能够调用。
any
示例:
function invokeAnything(callback: any) {
// 能够对 `any` 类型执行任何操作
callback();}
invokeAnything(1); // 能够把任何货色调配给 `any` 类型
如果 callback
是 any
, TypeScript 就不会强制 callback()
语句进行任何类型查看。
3. 总结
unknown
和 any
是 2 个非凡的类型,能够包容任何值。
举荐应用 unknown
而不是 any
,因为它提供了更平安的类型 – 如果想对 unknown
进行操作,必须应用类型断言或放大到一个特定的类型。
~~ 完,我是小智,女票在教培行业工作,最近发的工资有点低,我筹备多多下海工作,赚更多的钱了。
编辑中可能存在的 bug 没法实时晓得,预先为了解决这些 bug, 花了大量的工夫进行 log 调试,这边顺便给大家举荐一个好用的 BUG 监控工具 Fundebug。
原文:https://dmitripvlutin.com/typ…
交换
有幻想,有干货,微信搜寻 【大迁世界】 关注这个在凌晨还在刷碗的刷碗智。
本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试残缺考点、材料以及我的系列文章。