Я пытаюсь создать набор классов , которые все должны иметь доступ друг к другу.Следуя руководству по MobX, я бы хотел, чтобы моя структура была такой:
RootStore
├─ ApplicationStore
├─ UserStore
├─ EventStore
└─ ...Store
Теперь, если я создаю каждое хранилище с параметром RootStore, я могу искать события для пользователя и т. Д. Все хорошо, приложение работает, ноТест Jest взрывается, когда я хочу использовать подсказку типа:
RootStore.js
import UserStore from './UserStore.mobx'
import ApplicationStore from './ApplicationStore.mobx'
export default class RootStore {
userStore: UserStore
appStore: ApplicationStore
}
UserStore.js
import RidersProvider from '../providers/RidersProvider'
import RootStore from './RootStore.mobx'
export default class UserStore {
provider: RidersProvider
rootStore: RootStore
@observable _users = []
constructor (rootStore: ?RootStore, userProvider: ?RidersProvider) {
this.rootStore = rootStore
this.provider = userProvider
}
...
Теперь, если я удалю импорт в UserStore,все работает нормально, но тогда я не намекаю на тип.Есть ли хорошее решение для этого?Я провел дни, просматривая статьи о циркулярных ссылках (и схожу с ума), но я не мог найти подсказку, как правильно это исправить.
Ссылочная проблема, с которой я столкнулся, такова: Require cycle: src/Connection.js -> stores/RootStore.singleton.js -> stores/RootStore.mobx.js -> stores/UserStore.mobx.js -> providers/RidersProvider.js -> src/Connection.js
Итак, Connection
использует RootStore
для доступа к ApplicationStore.accessToken
, что необходимо для получения сведений о пользователе в UserStore
.К этому моменту я мог бы просто избавиться от RootStore
, который упоминается в MobX лучших практиках , если только я не понял концепцию.
Но проблема не столько в RootStore, сколько в том, что если я хочу напечатать подсказку с помощью provider: RidersProvider
, она не будет выполнена.В PHP я бы просто использовал ProviderInterface
(и StoreInterface) и никогда не столкнулся бы с циклической зависимостью, но в JS я не вижу альтернативы, кроме TypeScript, но есть ли такая?