乐趣区

关于前端:TypeScript-中-unknown-与-any-有啥区别

作者: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;

那当初就有一个问题了,anyunknown 有啥区别?

1. unknown vs any

为了更好地了解 unknownany 之间的区别,咱们先从编写一个想要调用其惟一参数的函数开始。

咱们将 invokeAnything() 的惟一参数设置为 any 类型

function invokeAnything(callback: any) {callback();
}

invokeAnything(1); // throws "TypeError: callback is not a function"

因为 callback 参数是任何类型的,所以语句 callback() 不会触发类型谬误。咱们能够用any 类型的变量做任何事件。

然而运行会抛出一个运行时谬误:TypeError: callback is not a function1 是一个数字,不能作为函数调用,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` 类型

如果 callbackany, TypeScript 就不会强制 callback() 语句进行任何类型查看。

3. 总结

unknownany 是 2 个非凡的类型,能够包容任何值。

举荐应用 unknown 而不是 any,因为它提供了更平安的类型 – 如果想对 unknown 进行操作,必须应用类型断言或放大到一个特定的类型。

~~ 完,我是小智,女票在教培行业工作,最近发的工资有点低,我筹备多多下海工作,赚更多的钱了。


编辑中可能存在的 bug 没法实时晓得,预先为了解决这些 bug, 花了大量的工夫进行 log 调试,这边顺便给大家举荐一个好用的 BUG 监控工具 Fundebug。

原文:https://dmitripvlutin.com/typ…

交换

有幻想,有干货,微信搜寻 【大迁世界】 关注这个在凌晨还在刷碗的刷碗智。

本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试残缺考点、材料以及我的系列文章。

退出移动版