Есть ли способ набрать объект обработчики редуктора? - PullRequest
0 голосов
/ 19 апреля 2020

Я хочу использовать такой редуктор, как этот.

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>?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...