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