Поражение несовместимости Array <T>и IObservableArray <T> - PullRequest
0 голосов
/ 27 ноября 2018

Предположим, у меня есть какое-то свойство в моем магазине, представляющее собой массив некоторого типа MyType и , украшенный наблюдаемым:

class MyStore {
    @observable array
}

Я знаю, что в нормальном мире это должно бытьArray<MyType>.Но когда я объявляю это таким образом,

class MyStore {
    @observable array: Array<MyType>
}

, тогда я теряю метод .remove(item: MyType).С другой стороны, если я объявляю это с помощью IObservableArray<MyType>,

class MyStore {
    @observable array: IObservableArray<MyType>
}

, тогда я теряю возможность юридически присвоить значения Array<MyType> этой пропе (под юридически Я имею в виду присвоение без построения ... as IObservableArray<MyType> - недостатки этого метода слишком очевидны: много ненужного кода, тип должен импортироваться всякий раз, когда он используется, и т. Д.)

Я также пытался использовать типы объединения и пересечения:

  1. Пересечение (Array<MyType> & IObservableArray<MyType>) выдает ошибку при назначении значения Array<MyType> этому реквизиту: Property 'spliceWithArray' is missing in type MyType.
  2. Объединение (Array<MyType> | IObservableArray<MyType>) по-прежнему приводит к потереМетод .remove(item: MyType).

Я что-то упускаю или неправильно понимаю?Есть ли законный способ победить его?Заранее всем спасибо!


Кстати, версия mobx, которую я использую, - 4, потому что мне необходимо поддерживать старые iPad, к сожалению,

1 Ответ

0 голосов
/ 10 января 2019

Как насчет создания собственного настраиваемого типа, расширения класса Array и ручной реализации методов IObservableArray в качестве необязательного?

Поскольку вы заблокированы на mobx@4.6.0, нет проблем с поддержанием интерфейса, так какулучшения версии.

это не идеально, но это единственный способ, который я могу придумать, который позволит вам назначить массив, а также использовать такие методы, как .remove ().

Я вызываю тип MyExtendedObservableArray :

import {IArrayChange, IArraySplice, IArrayWillChange, IArrayWillSplice, IInterceptor, IObservableArray, Lambda, observable} from "mobx";

interface MyExtendedObservableArray<T> extends Array<T>{
    spliceWithArray?(index: number, deleteCount?: number, newItems?: T[]): T[];
    observe?(listener: (changeData: IArrayChange<T> | IArraySplice<T>) => void, fireImmediately?: boolean): Lambda;
    intercept?(handler: IInterceptor<IArrayWillChange<T> | IArrayWillSplice<T>>): Lambda;
    clear?(): T[];
    peek?(): T[];
    replace?(newItems: T[]): T[];
    find?(predicate: (item: T, index: number, array: IObservableArray<T>) => boolean, thisArg?: any, fromIndex?: number): T | undefined;
    findIndex?(predicate: (item: T, index: number, array: IObservableArray<T>) => boolean, thisArg?: any, fromIndex?: number): number;
    remove?(value: T): boolean;
    move?(fromIndex: number, toIndex: number): void;
    toJS?(): T[];
    toJSON?(): T[];
}

class MyType{}
let myType = new MyType();

class MyStore {
    @observable array: MyExtendedObservableArray<MyType> = [myType] 
    // no TSC compilation error
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...