Можно ли перебирать значения типов в Typescript и создавать на их основе новый тип? - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь создать определение типа для моего редукса ACTION_HANDLERS, и мне нужно получить типы для всех действий. У меня есть тип объединения действий, который содержит тип действия и тип полезной нагрузки, но я не могу найти примеров того, как выполнить итерацию и извлечь их.

Я не уверен, что это еще можно сделать, но, возможно, кто-то может помочь найти решение.

import generateReducer from '@/utils/generateReducer';
import action, { ActionsUnion } from '@/utils/action';

const initialState = {};

const ADD = '[elements] ADD';
const REFRESH = '[elements] REFRESH';

export const ActionCreators = {
  add: action<typeof ADD, { elementIds: string[] }>(ADD),
  refresh: action(REFRESH)
};

// This is what I'm trying to create types for
const ACTION_HANDLERS = {
  [ADD]: (state, { payload }) => ({ ...state, ...payload }),
};

export default generateReducer(ACTION_HANDLERS, initialState);
// Here are some useful types to explain everything better
const ActionCreators: {
    add: ActionWithPayloadFn<"[elements] ADD", { elementIds: string[]; }>;
    refresh: ActionFn<"[elements] REFRESH">;
}

// ActionCreators with no keys
type ActionsUnion = ActionWithPayload<"[elements] ADD", { elementIds: string[]; }> | Action<"[elements] REFRESH">

// How can I use the 'ActionsUnion' type above to generate something like:
type ActionHandlers = {
    "[elements] ADD": (state: any, ActionWithPayload<"[elements] ADD", { elementIds: string[] }>) => any,
    "[elements] refresh": (state: any, Action<"[elements] refresh">) => any
}

// Here is some pseudo-code:
type ActionHandlers<StateType, ActionsUnion> = {
    const resultType = {};

    for (let i = 0; i < ActionsUnion.length; i++) {
      resultType[ActionsUnion[i].type] = (state: StateType, action: ActionsUnion[i]) => StateType
    }

    return resultType;
}

// So I would be able to use it like so:
const ACTION_HANDLERS: ActionHandlers<MyStateType, ActionsUnion> = {...}

Если есть лучший способ набирать избыточный магазин и логику, я бы тоже хотел это услышать.

...