TypeScript - 为什么使用“unknown”而不是“any”?
正如我在上一篇文章中提到的,我尽量避免使用anyTypeScript。虽然我理解跳过类型检查的必要性,但我认为使用anyTypeScript 完全违背了其初衷。幸运的是,我在工作中也使用了 ESLint,所以除非我禁用某些特定规则,否则我无法any在我的代码中集成 TypeScript。
如果你确实需要跳过类型检查,可以使用 TypeScript3.0引入的`int`unknown类型。与 `int` 不同any,unknown`int` 更安全,因为在使用这种类型的数据之前,必须进行某种检查,而 `int` 则any没有任何限制。
任何值都可以赋给 `unknown`,但 `unknown` 本身不能赋给任何其他值,除非
itself进行any类型断言或基于控制流的类型缩小。同样,对 `unknown` 进行任何操作都必须先进行类型断言或类型缩小到更具体的类型。
这究竟意味着什么?让我们来看下面的例子:
我们看到,我们可以将任何值赋给一个类型为 `T` 的变量unknown(我只用了几种类型来说明这一点)。现在让我们看看当我们尝试将值重新unknown赋给一个非 `T`any或 `C`类型的值时会发生什么unknown:
注意以下几点:我们可以将任何值赋给类型为 `int`any和 `nil`的变量unknown。我们只能将any类型为 `int` 的变量重新赋值为任何值(在本例中,是类型为 `number` 的变量)。尝试将其重新赋值unknown为类型为 `nil`string或 `nil`的变量number将会抛出错误(如前所述,它只能重新赋值为 `int`any或 `nil` unknown)。
单独来看,类型为 `T` 的变量unknown用处不大,但当需要进行额外检查时,它们就非常强大了。我将举个例子来与 `T`any类型进行比较:
查看上面的代码,我们有两个变量,一个类型为 `Array` any,另一个类型为 `Array` unknown。当尝试对`Array` 执行.map()方法时variable_of_any_type,编辑器不会报错,尽管它并不知道该变量是否真的是数组类型(正如我们所见,它不是)。直到编译之后,我们才会发现这个问题,届时会收到一个错误提示Uncaught TypeError: variable_of_any_type.map is not a function。
当尝试对类型为 `<type>` 的变量执行相同的操作时unknown,编辑器会报错并提示错误Object is of type 'unknown'.。这意味着它仍然无法确定该变量是否为数组,因此我们需要进行额外的检查。在接下来的代码行中,我们进行了这项检查,发现 `<type>`variable_of_unknown_type确实是一个数组,因此我们可以.map()对其执行该函数。
图片来源:Unsplash 上的 ThisisEngineering RAEng/@thisisengineering
文章来源:https://dev.to/arikaturika/typescript-why-to-use-unknown-instead-of-any-41i8