Тип подсказки против циклической ссылки в JavaScript - PullRequest
1 голос
/ 23 марта 2019

Я пытаюсь создать набор классов , которые все должны иметь доступ друг к другу.Следуя руководству по 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, но есть ли такая?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...