Идиоматический способ объединения фрагментов и редукторов redux toolkit

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

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

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

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

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

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

Поскольку машинописный текст является более или менее синтаксическим сахаром поверх 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, я мог бы немного пошалить.

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

Какие-либо предложения?

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

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

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

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

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

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

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

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

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

0 ответов

Другие вопросы по тегам