Проблема в том, что функция isAAction
просто возвращает логическое значение, но Typescript не может знать, что это логическое значение указывает тип действия.
Первое решение - просто приведите его к действию:
return { ...state, a: reducerA(state.a, action as AAction) };
Второе решение - заменить isAAction
метод на typeguard, тогда Typescript будет знать, что эта функция возвращает true, когда AAction
передается в качестве аргумента
function isAAction(action: any): arg is AAction {
return action.type.includes('_A');
}
// ...
if (isAAction(action)) {
return { ...state, a: reducerA(state.a, action) };
}
РЕДАКТИРОВАТЬ: ссылаясь на ваш комментарий. Лично я бы вообще не использовал редуктор reducerBase
, а просто использовал следующую структуру. Тип действия определит, какой редуктор должен реагировать на данное действие.
const reducers = {
stateA: reducerA,
stateB: reducerB,
stateC: reducerC
};
export const store = createStore(
combineReducers(reducers)
);
export function reducerA(state = new StateA(), action: AAction) {
switch (action.type) {
case AActionType.SOME_ACTION: return {
...state,
// some changes based on action
}
case AActionType.OTHER_ACTION: return {
...state,
// some changes based on action
}
default: return state;
}
}