Techstack:React、redux、redux 工具包(通过扩展 Immer)。
用例- 我正在尝试组合切片。切片用于独立的状态片段,其接口由第三方库定义。
我正在尝试做一些非常规的事情。我已经很久没有在 React 或 redux 上做任何认真的工作了,所以我可能错过了一些有用的库。我已经完成了初步扫描,但没有找到任何适合我口味的东西。然而,建议总是受欢迎的。
另外,这是我第一次认真尝试使用打字稿。因此,尽管我已经完成了作业,但我的大脑还没有被所有打字稿习语和好东西连接起来。
我不想放弃我仅用于此用例的任何技术。
这个用例将不断重复。我相信社区中的其他人也面临过类似的问题。
由于 typescript 或多或少是 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 的一部分,所以我可能会做一些疯狂的事情。
但是,如果我能找到一种惯用的方法,我可以将这个逻辑推广到上游,甚至可以开源它。
有什么建议么?
编辑:添加进一步说明
Slice 有 2 个输出,CaseReducers 和一个 reducer,我认为这是一个 reducer,它结合了提供给 slice 的所有 reducer。我还没有完成在我的代码中为上面的代码运行单元测试。在隐藏上面的代码是否真的可以工作的其他错误中有点迷失。我以为是在某一时刻。
请注意,上面的代码是实际代码的代表。
这是一个示例架构
{
"key1" : {
"A" : "SomeA",
"B" : "SomeB"
},
"key2" : {
"A" : "SomeA",
"B" : "SomeB"
}
}
如您所见,key1
和的架构key2
是相同的。所以我希望有相同的切片代码来处理key1
和key2
参数化以处理状态的正确部分。
同样,这个例子是有代表性的。我正在处理的状态对象很大并且有深度。
此外,状态对象在第三方库中被描述为“打字稿”接口。我认为我应该继续处理相同的问题,而不是编写自己的 JSON 模式。因此,我在keyof
这里使用运算符。
但是如果我能正确解决这个参数化问题,我可以显着地重用代码。