JavaScript中的类型提示与循环引用

时间:2019-03-23 07:06:09

标签: javascript ecmascript-6 ecmascript-7

我正在尝试创建一组都需要互相访问的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,我没有看到其他选择,但是有吗?

0 个答案:

没有答案