击败阵列 和IObservableArray 配伍禁忌

问题描述 投票:1回答:1

假设我的商店中有一些属性是某种类型的MyType数组,并用observable装饰:

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> - 这个方法的缺点太明显了:很多不必要的代码,类型应该在任何时候使用,等等)

我也尝试使用union和intersection类型:

  1. 交叉点(Array<MyType> & IObservableArray<MyType>)在为此prop:Array<MyType>分配Property 'spliceWithArray' is missing in type MyType值时会产生错误。
  2. 联盟(Array<MyType> | IObservableArray<MyType>)仍然导致失去方法.remove(item: MyType)

我错过了什么或误解了什么?有没有合法的方法来打败它?谢谢大家!


顺便说一句,我使用的mobx版本是4,因为我不得不支持旧的iPad,不幸的是

typescript types mobx mobx-react
1个回答
1
投票

如何创建自己的定制类型,扩展Array类并手动实现IObservableArray方法作为可选项?

由于你被锁定到[email protected],因此随着版本的推进,维护界面没有问题。

它不是理想的,但它是我能想到的唯一方法,它允许你分配数组,也使用像.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
}
© www.soinside.com 2019 - 2024. All rights reserved.