Идиоматический способ объединения фрагментов и редукторов 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
оператор здесь.
Но если я смогу правильно решить эту проблему параметризации, я смогу значительно повторно использовать код.