TypeScrip 3.x:访问类型未知的属性 [英] TypeScript 3.x: Access properties of type unknown

查看:9
本文介绍了TypeScrip 3.x:访问类型未知的属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我从TypeScrip文档中看到,您不能从类型UNKNOWN访问属性:

// No property accesses, element accesses, or function calls

function f11(x: unknown) {
    x.foo;  // Error
    x[5];  // Error
    x();  // Error
    new x();  // Error
}

但我不明白为什么?如果我可以分配包括对象在内的每个值,为什么我无法访问属性?

我遇到了以下情况:我有一个any类型的对象,我将其传递给Object.entries方法,然后调用forEach

因为它是any类型,forEach调用参数将是一个数组,其中第一个元素为字符串类型,第二个元素为未知类型。

在我的例子中,第二个元素是一个对象,但如果不转换它的类型,我就无法访问它的属性,这似乎是错误的。

下面是一个抛出TS错误的示例(这只是一个抽象,我知道在本例中将其声明为Any是没有意义的):

const obj: any = {
  val1: "someval",
  val2: {
    some: "some",
    object: "object",
  },
};
Object.entries(obj).forEach(el => {
  if (el[1].some) {
    console.log(el);
  }
});

我猜这也可能是Object.entries方法的类型错误,但我仍然希望解释一下,为什么我无法访问未知类型的属性。

作为总结,我的问题是:

  1. 为什么即使未知类型可以是对象,我也无法访问未知类型的属性?
  2. 我猜出现上述问题是有原因的,但是Object.entries不应该返回一个带有元素nr的数组吗?类型为字符串且元素为nr的0。任何类型的%1?

推荐答案

我认为为了回答您的问题,重要的是提供一些关于anyunknown的上下文。虽然您可以在official TypeScript documentation中找到一个详尽的比较列表,但我认为我可以冒昧地将这篇文章缩短为几个声明:any基本上是一种适用于所有类型的,因此不是类型安全。所谓类型安全,是指您可以访问不存在的any的运行时属性。

unknown不同。unknown在这方面与any相反。它代表了any的类型安全版本,声明"我不会假装我适合所有东西,因为我不适合"。因此unknown需要额外强制转换为所需类型才能工作(因为它本身没有任何属性)。

现在,来回答实际的问题。为什么Object.entries使用unknown而不是any?因为说"在使用前将此未知值转换为您需要的任何值,我不会假定我知道它是哪种类型"比"我不知道它是哪种类型,但我假定它具有所有可能类型的所有可能属性"更安全。

这篇关于TypeScrip 3.x:访问类型未知的属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆