假设我的商店中有一些属性是某种类型的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类型:
Array<MyType> & IObservableArray<MyType>
)在为此prop:Array<MyType>
分配Property 'spliceWithArray' is missing in type MyType
值时会产生错误。Array<MyType> | IObservableArray<MyType>
)仍然导致失去方法.remove(item: MyType)
。我错过了什么或误解了什么?有没有合法的方法来打败它?谢谢大家!
顺便说一句,我使用的mobx
版本是4
,因为我不得不支持旧的iPad,不幸的是
如何创建自己的定制类型,扩展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
}