Проблемы со ссылками на класс - PullRequest
0 голосов
/ 02 марта 2019

Я не уверен, как структурировать следующую проблему.Я ищу предложения по разработке или понимание того, как решить эту проблему.

У меня странная проблема с циклической ссылкой на класс, который должен ссылаться на член, который определен на основе класса, членом которого он является.Вероятно, легче показать с помощью кода, чем слова:

class FxRateReducer extends ImmerReducer<ContainerState>
    implements IActions {

    // Each function on this class is a redux action
    // This struct defines the redux actions for each function
    // We use this struct so one redux action here can trigger
    // the next.
    static actions: ActionCreators<typeof FxRateReducer>;

    *beginUpdateFxRate() {
        // The following can -sometimes- throw a typescript
        // because actions contains no definition of updateFxRate
        const type = FxRateReducer.actions.updateFxRate.type,
    }

    updateFxRate(newRate: FXRate): void {
        Object.assign(this.draftState, newRate);
    }
}

//////////////////////////////////////////////////////////////////////////

const actions = createActionCreators(FxRateReducer);
FxRateReducer.actions = actions;

Это основано на отличном проекте immer-reducer, с небольшой настройкой для легкого использования саг.Проект immer-reducer автоматически создает действия приведения на основе методов класса в функции createActionCreators.

При использовании саги я не могу напрямую вызывать другие функции, вместо этого мне нужно вызвать их, вызвав связанныеизлишнее действие.Это означает, что с beginUpdateFxRate мне нужно получить доступ к структуре, созданной createActionCreators, которая может быть вызвана только после объявления класса.

Кажется, что сгенерированный JavaScript никогда не имеет проблем, но компилятор TypeScript иногда выдает ошибки, которыеactions.updateFxRate не определен.Я предполагаю, что при полной перекомпиляции действия компилируются до объявления класса, и поэтому в его типе отсутствуют объявления функций.

Я пробовал разные идеи, чтобы это исправить.Мне действительно нравится, когда действия присутствуют в самом классе, и ошибка компилятора встречается не часто, и я бы хотел оставить ее там.Мне также нравится информация о наборе текста, поэтому я не в восторге от того, чтобы изменить ее тип на «любой» или похожий.Но я также хотел бы больше не видеть эту ошибку.Как я могу организовать эти объявления, чтобы избежать ошибки?

...