Я хочу использовать такой редуктор, как этот.
const ADD_ITEM = "ADD_ITEM";
const handlers: Handlers = {
[ADD_ITEM]: (state, action) => {
return {
...state,
items: [...state.items, action.payload],
};
}
};
const reducer = (state: State = initialState, action: Actions) => {
const handler = handlers[action.type];
return handler ? handler(state, action) : state;
};
И набрать несколько символов.
// Extract action creator type from object with action creators
type Infer<T> = T extends { [key: string]: infer U } ? U : never;
// Extract action types from action creators
type InferActions<T extends { [key: string]: (...args: any) => any }> = ReturnType<Infer<T>>;
Используя их вот так.
const actions = {
addItem: (item: Item) => ({ type: ADD_ITEM, payload: item } as const),
};
type Actions = InferActions<typeof actions>;
У меня есть попытался реализовать тип Handlers
следующим образом.
type Handler<State, Action> = (state: State, action: Action) => State;
// import { Action } from "redux"
type InferHandlers<Actions extends Action, State> = {
[T in Actions["type"]]: Handler<State, Actions>;
};
Но в этом случае поле (..., action)
в функции-обработчике может иметь любое из существующих действий. Есть ли способ передать правильный тип действия в Handler<State, Action>
?