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

时间:2019-03-17 18:32:56

标签: reactjs typescript reinforced-typings

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

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

type1:{}

type2:type3 | type4 | type5 | type6

3-6型的

彼此在结构上略有不同,因此无法组合。在isConversion标志下面的函数中,检查(object:type6)。该对象内部还有另一个类型7的对象。

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

在type7内部是一个称为“转换”的字段,其中包含我需要传递到时间轴的数据。

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

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

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

谢谢。

1 个答案:

答案 0 :(得分:1)

So you want to know if you can determine if items type is Type6?

Typescript types are lost after compilation so you have to write your own typeguard which will return true if object is Type6. It's pure javascript check, for example if you know that only Type6 has certain field you can check if it is present in this object.

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

interface Type7 {
  conversions: any[];
}

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

Then you can use this typeguard like this:

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