嵌套在其他类型中的 Typescript Access 对象

Typescript Access objects nested within other types

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

我有一个函数可以用来将数据提供给时间轴组件。函数接收到的数据可以是类型 1 或类型 2。现在这就是它变得复杂的地方,类型 1 是一个对象。但是,类型 2 可以是 4 种不同类型中的任意一种

类型 1:{}

类型 2:类型 3 |类型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。并使用该值,但我想知道是否有办法获取上述转换对象。

谢谢。

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

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

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

interface Type7 {
  conversions: any[];
}

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

然后你可以像这样使用这个类型保护:

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