在 NGRX 中合并两个减速器

Merge two reducers in NGRX

我正在使用 @ngrx@9.2.0 并且我有一个在工厂中创建的减速器,因为它对于我项目中的多个实体都是相同的。

function createEntityReducer(initialState, actions) {
  const reducer = createReducer(
    initialState,
    on(actions.loadAll.success, (state, action) => {
      ...
    })
  ); 
  return reducer;
}

const generalReducer = createEntityReducer(initialState, actions);

但我想扩展这个基本的 reducer 以用于某个实体的特定操作。

const specificReducer = createReducer(
        initialState,
        on(actions.loadChildren.success, (state, action) => {
          ...
        })
      );

如何合并两个 reducer,而不必像这样创建嵌套特征

const reducer = mergeReducers(generalReducer, specificReducer);

在检查了 @ngrx/store/createReducer 函数的工作原理后,我编写了以下似乎可以正常工作的代码。

function mergeReducers<TState>(
  ...reducers: ActionReducer<TState, Action>[]
): ActionReducer<TState, Action> {
  const mergedReducers = (
    state: TState | undefined,
    action: Action
  ): TState => {
    if (reducers.length === 0) {
      throw new Error('At least one reducer was expected');
    }
    const newState = reducers.reduce((initialState, reducer) => {
      const intermediaryState = reducer(initialState, action);
      return intermediaryState;
    }, state);

    return newState as TState;
  };
  return mergedReducers;
}