【问题标题】:Typescript Access objects nested within other typesTypescript 访问嵌套在其他类型中的对象
【发布时间】:2019-03-18 07:05:46
【问题描述】:

我对打字稿比较陌生,它的来龙去脉,我在某种结构上遇到了麻烦。它看起来像这样:

我有一个函数用于将数据提供给时间线组件。函数接收到的数据可以是类型 1 或类型 2。现在这很复杂,类型 1 是一个对象。但是,类型 2 可以是 4 种不同类型中的任何一种

类型 1:{}

type2 : type3 |类型4 |类型5 | 6型

类型 3-6 在结构上略有不同,不能组合。在下面的函数中,isConversion 标志是对 (object: type6) 的检查。该对象内部还有另一个类型为 7 的对象。

type 6: {
   ...,  
   type7: {
       ...,
       conversions
   }
}

type7 内部是一个名为conversions 的字段,其中包含我需要传递给时间线的数据。

timelineItems = (items: type1 | type2): PropsData => {
    const { dataType, isConversion } = this.state

    if(isConversion){
      const {comments, type7.conversions } = items as type6
      return {
        comments
        type7.conversions
      }
    }

我有一个解决方法,当我获取数据并将其设置为状态时,我会获取 type7。并使用该值,但我想知道是否有办法获取上述转换对象。

谢谢。

【问题讨论】:

标签: reactjs typescript reinforced-typings


【解决方案1】:

所以你想知道是否可以确定items类型是否为Type6

Typescript 类型在编译后会丢失,因此您必须编写自己的 typeguard,如果 object 是 Type6,它将返回 true。这是纯 javascript 检查,例如,如果您知道只有 Type6 具有某个字段,您可以检查它是否存在于该对象中。

interface Type6 {
  comments: any[];
  type6: Type7;
}

interface Type7 {
  conversions: any[];
}

function isType6(obj): obj is Type6 {
  return obj.type6 !== undefined;
} 

那么你可以像这样使用这个 typeguard:

if(isType6(items)) {
  const {comments, type6: {conversions}} = items; // no cast needed, ts know it is Type6
  return {comments, conversions };
}

【讨论】:

    猜你喜欢
    • 2019-03-12
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 2012-12-14
    • 2022-01-21
    • 2021-09-25
    相关资源
    最近更新 更多