Безопасный доступ к свойству на необязательном типе потока - PullRequest
0 голосов
/ 26 апреля 2018

Я хочу безопасно получить доступ к свойству типа Union (все параметры являются интерфейсами), установленного внешней библиотекой (mobx).

 Cannot call observe because:
 Either property added is missing in IArrayChange [1] but exists in IArraySplice [2] in the first argument.
 Or property added is missing in IObjectChange [3] but exists in IArraySplice [2] in the first argument.

 142│     observe(thisContainer.items, (change: IArraySplice<any>) => {
 143│        change.added.forEach((item: Item) => this.observeChanges(item));
 145│     });
 146│   }
 147│

 node_modules/mobx/lib/mobx.js.flow
  356│     listener: (change: IArrayChange<T> | IArraySplice<T>) => void,

  372│     listener: (change: IObjectChange) => void,

Я пробовал:

  • , используя условные выражения для проверки существования .added перед запуском change.added.iterator. if (change.added){ && if ('added' in change) {

  • с помощью условия, чтобы проверить, что универсально доступное свойство type установлено в splice. Это должно гарантировать, что добавленное свойство также доступно. change.type === 'splice' && change.added....

Документы предлагают типично писать условия для проверки типов https://flow.org/en/docs/types/unions/ Но я не уверен в наилучшем способе сделать это с интерфейсами внешней библиотеки. Авторские функции, такие как Проверка типа интерфейса с помощью Typescript выглядит тяжелее, чем мне хотелось бы, чтобы соответствовать правилам проверки типов перед фиксацией.

Как это должно быть сделано?

1 Ответ

0 голосов
/ 26 апреля 2018

Рабочий раствор:

observe(thisContainer.items, (change: IArraySplice<any> | IArraySplice<T>) => {
    if (change.type === 'splice') {
        change.added.forEach((item: Item) => this.observeChanges(item));
    }
});

Пояснение:

Хотя сообщение об ошибке фокусируется на существовании свойства, ошибка вызывается b / c, передаваемый аргумент не обязательно соответствует ожидаемому.

Поскольку изменения в mobx IObservableArray могут генерировать либо IArraySplice<T>, либо IArraySplice<T>, типы потока должны быть учтены либо.

Как только это будет обработано, свойства, доступные для обоих ожидаемых, станут доступными для уточнения.

Для справки, реализации MOBX типов:

export interface IArrayChange<T> {
    type: "update",
    object: IObservableArray<T>,
    index: number,
    newValue: T,
    oldValue: T
}

export interface IArraySplice<T> {
    type: "splice",
    object: IObservableArray<T>,
    index: number,
    added: T[],
    addedCount: number,
    removed: T[],
    removedCount: number
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...