#reactjs #typescript #typescript-typings #mobx
#reactjs #typescript #typescript-типизации #mobx
Вопрос:
У меня проблема с рекурсивными ссылками на TypeScript. Я провожу два дня, пытаясь разобраться в этом, и мне действительно нужна помощь.
Я использую MobX, и у меня есть одно родительское хранилище и два дочерних хранилища. Ниже приведен обзор моей настройки. Обратите внимание на то, как я передаю родительское хранилище дочерним хранилищам. (Пример приложения)
// ChartWidget.store.ts
const ChartWidgetStore = (dashboardPageStore: IDashboardPageStore) => observable({ /*...*/ });
// TableWidget.store.ts
const TableWidgetStore = (dashboardPageStore: IDashboardPageStore) => observable({ /*...*/ });
// DashboardPageStore.store.ts
export const DashboardPageStore = () => {
const store = observable({
chartWidgetStore = null,
tableWidgetStore = null,
});
store.chartWidgetStore = ChartWidgetStore(store);
store.tableWidgetStore = TableWidgetStore(store);
return store;
};
export interface IDashboardPageStore extends ReturnType<typeof DashboardPageStore> {}
Если я дам дочерним / виджетным хранилищам тип:
chartWidgetStore: null as IChartWidgetStore,
tableWidgetStore: null as ITableWidgetStore,
Я получаю сообщение об ошибке: Type 'IDashboardPageStore' recursively references itself as a base type.(2310)
и все мои типы становятся any
. Я думаю, что они становятся any
из ReturnType
-за того, что тип путается с рекурсивными ссылками.
Ответ №1:
IChartWidgetStore
используется для свойстваDashboardPageStore
DashboardPageStore
используется для получения типа дляIDashboardPageStore
IDashboardPageStore
используется для ввода аргументаChartWidgetStore
ChartWidgetStore
используется для получения типаIChartWidgetStore
… и теперь мы прошли полный круг.
Если дочерние элементы зависят от родителей, то родители не могут зависеть от дочерних элементов, и наоборот.
Комментарии:
1. Я слышу тебя, но если приложение работает и не имеет проблем из-за ссылок на полный круг, то почему типы не могут работать? Если я напишу это с помощью классов, и у них будут одинаковые ссылки, это сработает.
2. Вы всегда можете просто
//@ts-ignore
, если не хотите ничего реструктурировать.