Я использую дерево состояний mobx с Typescript в приложении React. И у меня проблема с Typescript, когда он жалуется на тип типа mobx types.safeReference
. Похоже, что тип safeReference
в определении модели отличается от его типа, когда вы используете .create()
для фактического создания экземпляра модели. В моем коде тип selectedProduct
преобразуется в string | number | undefined | null
в productStore
, но в определении модели IStateTreeNode<...> | undefined | null
, и поэтому я получаю ошибку в моем корневом хранилище. Как я могу это исправить?
Вот мой продуктовый магазин:
import { types } from "mobx-state-tree";
const Product = types.model("Product", {
id: types.identifier,
name: types.string
})
const ProductStore = types
.model("ProductStore", {
products: types.array(Product),
selectedProduct: types.safeReference(Product),
})
.actions((self) => ({
// actions here
}));
export const productStore = ProductStore.create({
products: [],
selectedProduct: undefined // the type here is different from the type in the actual model
});
И вот мой корневой магазин:
import { types } from "mobx-state-tree";
import ProductStore, { productStore } from "./product-store";
const RootStore = types.model('RootStore', {
productStore: ProductStore
})
export const rootStore = RootStore.create({
productStore: productStore // Here is where I get the typescript error.
});
ОБНОВЛЕНИЕ:
Другой способ воспроизвести эту проблему - попытаться создать настраиваемую ссылку. Получатель будет жаловаться на то, что undefined
не может быть назначен типу {...}.
const ProductByIdReference = types.maybeNull(
types.reference(Product, {
get(id: number, parent: Instance<typeof ProductStore>) {
return parent.products.find(p => p.id === id) || undefined
},
set(value: Instance<typeof Product>) {
return value.id
}
})
)
ProductStore
синглтон, не могли бы вы позволитьRootStore
создать его за вас? Т.е.export const rootStore = RootStore.create({ productStore: { products: [], selectedProduct: undefined } });
- person Tholle   schedule 29.01.2021RootStore.create
ищет необработанное значение, а не созданное хранилище. Если вы передадите ему начальное состояниеproductStore
, а не само хранилище, тогда он будет работать нормально. Не уверен, что это вообще полезно, но этот ответ показывает совсем другой способ объединения магазинов: stackoverflow.com/a/54081439/10431574 < / а> - person Linda Paiste   schedule 03.02.2021IMSTArray
norefer.com / mobxjs / mobx-state-tree / blob / и ожидает фактический массив. Он жалуется, чтоIMSTArray
не имеет всех методов, которые должен иметь массив. - person Linda Paiste   schedule 03.02.2021