我正在尝试创建一组都需要互相访问的classes。遵循MobX指南,我希望具有这样的结构:
RootStore
├─ ApplicationStore
├─ UserStore
├─ EventStore
└─ ...Store
现在,如果我使用RootStore参数构造每个Store,我可以为用户查找事件等。一切都很好,应用程序可以运行,但是当我想使用类型提示时,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
中获取用户详细信息所必需的。此时,除非我误解了这个概念,否则我可以摆脱MobX best practices中提到的RootStore
。
但是问题不是RootStore引起的,而是如果我想使用provider: RidersProvider
来输入提示的事实就会失败。在PHP中,我只使用了ProviderInterface
(和StoreInterface),并且从未遇到过循环依赖,但是在JS中,除了TypeScript,我没有看到其他选择,但是有吗?