Idiomati c способ объединения ломтиков и редукторов в редуксе - PullRequest
0 голосов
/ 15 апреля 2020

Techstack : набор инструментов React, redux, redux (по расширению Immer).

Вариант использования - Я пытаюсь объединить фрагменты. Срезы предназначены для независимых частей состояния, интерфейс которых определяется сторонней библиотекой.

Я пытаюсь сделать что-то необычное. Прошло много времени с тех пор, как я серьезно занимался React или Redux, поэтому я мог упустить некоторые полезные библиотеки, которые появились. Я сделал начальное сканирование и не нашел ничего подходящего моему вкусу. Тем не менее, предложения всегда приветствуются.

Кроме того, я впервые серьезно пытаюсь использовать машинопись. Поэтому, хотя я сделал свою домашнюю работу, мой мозг еще не подключен ко всем машинописным идиомам и вкусностям.

Я не хочу отказываться от любой из технологий, которые я использую только для этого использования case.

Этот вариант использования будет повторяться. Я уверен, что другие в сообществе сталкивались с подобными проблемами.

Поскольку машинописный текст является более или менее синтаптическим c сахаром над ES6, существует множество очевидных ограничений, которые делают такие случаи использования сложными для обработки.

export type Slices<T, U> = Record<keyof T, Slice<U>>;
export type Reducers<T,U> = Record<keyof T, CaseReducerWithPrepare<U, PayloadAction<any, string, never, never>>>;

export function combiner<T> (name : string, state : T, slices : Slices<T, any>,  reducers : Reducers<T, any>) 
    : Slice<T, SliceCaseReducers<T>, string> {
        let options : ValidateSliceCaseReducers<T, SliceCaseReducers<T>> = {}; 
        options = produce(options, draft => {
            for(let key in slices) {
                draft[key]=slices[key].reducer;
            }
            for(let key in slices) {
                draft[key]=reducers[key];
            }    
        })
        return createSlice({
            name,
            initialState : state,
            reducers : options
        })
};

Здесь я делаю что-то рискованное. Но код будет похоронен глубоко. Поскольку это не является частью контрактного API, я могу сойти с ума, сделав немного сумасшедшего.

Однако, если я найду идиоматический c способ сделать это, я смогу продвигать эту логику c вверх по течению и, возможно, даже сможет открыть его.

Есть предложения?

РЕДАКТИРОВАТЬ : Добавление дополнительных пояснений

Есть 2 выхода из Slice, CaseReducers и один редуктор, под которым я подразумевал редуктор, который объединяет все редукторы, которые были предоставлены для среза. Я еще не дошел до выполнения модульных тестов для кода выше в моем коде. Немного потеряно в других ошибках, которые скрывают, будет ли работать приведенный выше код на самом деле или нет. Я думал, что это было когда-то.

Обратите внимание, что приведенный выше код представляет фактический код.

Вот пример схемы

{
   "key1" : {
       "A" : "SomeA",
       "B" : "SomeB"
    },
   "key2" : {
       "A" : "SomeA",
       "B" : "SomeB"
    }
}

Как вы можете см. схемы для key1 и key2 одинаковы. Поэтому я хотел бы иметь тот же бит кода среза, который заботится о параметризации key1 и key2, чтобы иметь дело с правильной частью состояния.

Опять же, этот пример является представительным. Объект состояния, с которым я имею дело, является большим и имеет глубину.

Кроме того, объект состояния был описан как интерфейс «машинописного текста» в сторонней библиотеке. Я думал, что должен продолжать работать с той же самой, а не писать свою собственную схему JSON. Следовательно, здесь я использую оператор keyof.

Но если я смогу решить эту проблему правильной параметризации, я смогу значительно повторно использовать код.

...