Я хочу создать rootStore, который содержит другие хранилища. Проблема в том, что дети содержат такие свойства, как:
id: types.identifier(types.string),
И когда я создаю rootStore, я получаю сообщение об ошибке от ребенка:
[mobx-state-tree] Ошибка при преобразовании
{}
вSomeModelStore
: по пути "/id" значениеundefined
не может быть присвоено типу:identifier(string)
(значение не является строкой), ожидается экземплярidentifier(string)
или вместо этого снимок какidentifier(string)
.
Я пытался использовать types.late
но это не помогло.
Решение, которое я нашел, состоит в том, чтобы обернуть все свойства в types.maybe
Примеры:
ошибка: https://codesandbox.io/s/yvnznxyvyj?module=%2Fmodels%2FSomeModelStore.js
Обходной путь: https://codesandbox.io/s/0mv558yq50?module=%2Fmodels%2FSomeModelStore.js
Здесь https://codesandbox.io/s/yvnznxyvyj?module=%2Fmodels%2FSomeModelStore.js вы создаете пустой объект
.model("FirstStore", {
item: types.optional(SomeModelStore, {})
})
но типа
SomeModelStore
не поддерживает пустые поля. Если ты пишешь так
export const FirstStore = types
.model("FirstStore", {
item: types.optional(SomeModelStore, {
id: 'defaultId',
activate: false,
name: 'defaultName'
})
})
это будет работать. Или вы можете использовать "types.maybe" вместо "types.optional".
export const FirstStore = types
.model("FirstStore", {item: types.maybe(SomeModelStore)})
Также читайте о types.reference
Я думаю, что это лучший способ использовать его в вашем случае.