Typescript Доступ к объектам, вложенным в другие типы - PullRequest
0 голосов
/ 17 марта 2019

Я относительно новичок в машинописи, у меня есть входы и выходы, и у меня возникли проблемы с определенной структурой.это выглядит так:

У меня есть функция, которую я использую для подачи данных в компонент временной шкалы.данные, получаемые функцией, могут быть типа 1 или типа 2. Теперь это то, где они усложняются, тип 1 является объектом.Однако тип 2 может быть любым 1 из 4 различных типов

type1: {}

type2: type3 |type4 |type5 |type6

типы 3-6 немного отличаются друг от друга по структуре и не могут быть объединены.В функции под флагом isConversion находится проверка для (объект: type6).Внутри этого объекта есть еще один объект типа 7.

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

внутри типа 7 - поле, называемое преобразованиями, в котором содержатся данные, которые мне нужно передать на временную шкалу.

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 Ответ

1 голос
/ 18 марта 2019

Итак, вы хотите знать, можете ли вы определить, является ли тип items типом Type6?

Типы шрифтов теряются после компиляции, поэтому вы должны написать свой собственный typeguard, который будет возвращать true, если object Type6. Это чистая проверка 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 };
}
...