Я пытаюсь написать помощника, который позволит мне подписаться на определенный тип отправленных действий в приложении React. Вот интерфейсы действий, с которыми я работаю:
enum ActionTypes {
MoveToLine = 'MOVE_TO_LINE',
MoveToColumn = 'MOVE_TO_COLUMN',
}
interface MoveToLineAction {
type: ActionTypes.MoveToLine;
payload: { line: number };
}
interface MoveToColumnAction {
type: ActionTypes.MoveToColumn;
payload: { column: number };
}
type Actions = MoveToLineAction | MoveToColumnAction;
А вот реализация subscribeToAction
:
const subscribeToAction = <A extends { type: string }, T extends ActionTypes>(
type: T,
onAction: (a: A) => void,
) => (action: A) => {
if (action.type === type) {
onAction(action);
}
};
Я хочу использовать это так:
// Subscribe to a specific type of action
subscribeToAction(ActionTypes.MoveToLine, action => {
action.payload.line;
});
Проблема, с которой я сталкиваюсь, заключается в том, что я хочу, чтобы тип action
в прослушивателе onAction
определялся автоматически. В приведенном выше коде я получаю Property 'payload' does not exist on type '{ type: string; }'
ошибку. Я могу вручную ввести слушателя, чтобы обойти это следующим образом:
subscribeToAction(ActionTypes.MoveToLine, (action: MoveToLineAction) => {
action.payload.line;
});
Но кажется излишним передавать ActionType
, а затем также указывать тип действия в слушателе. Есть ли у вас какие-нибудь предложения, как этого избежать?