typescript - 如何关联高阶函数之间定义的泛型类型?
问题描述
我正在创建一个 Redux 存储增强器,它接受一个序列化 Redux 状态的函数。我将构建商店并为更改设置订阅——每次更改时,我都会序列化状态。对于这个 MCVE,我忽略了订阅方面,只是立即调用序列化函数。
但是,由于函数的高阶性质,我无法将状态的泛型类型(序列化函数所需)与商店创建者返回的泛型类型相关联:
// Copied and reduced from Redux 4.0.1
type Reducer<S = any> = (
state: S | undefined,
) => S
type DeepPartial<T> = { [K in keyof T]?: DeepPartial<T[K]> }
interface Store<S = any> {
getState(): S
}
type StoreEnhancer<Ext = {}, StateExt = {}> = (
next: StoreEnhancerStoreCreator
) => StoreEnhancerStoreCreator<Ext, StateExt>
type StoreEnhancerStoreCreator<Ext = {}, StateExt = {}> = <
S = any,
>(
reducer: Reducer<S>,
preloadedState?: DeepPartial<S>
) => Store<S & StateExt> & Ext
// My reduced code
interface Config<S> {
serialize: (state: S) => string;
}
const storage = <S>(config: Config<S>): StoreEnhancer => createStore => (reducer, preloadedState) => {
const { serialize } = config;
const theStore = createStore(reducer, preloadedState);
const state = theStore.getState();
const serializedState = serialize(state);
return theStore;
}
(操场)
错误是:
const serializedState = serialize(state);
^~~~~
Argument of type 'S & {}' is not assignable to parameter of type 'S'.
错误消息很烦人,因为我很确定这两者S
是不相关的;将定义更改StoreEnhancerStoreCreator
为使用X
而不是S
更改此错误消息。
如何将我的泛型类型参数与定义的泛型参数连接起来StoreEnhancerStoreCreator
?
解决方案
问题是storage
被声明为(间接地,通过StoreEnhancer
)返回 a StoreEnhancerStoreCreator
,这是一个必须为 all 工作的通用函数S
。但是,给定的调用会storage
产生一个仅适用于一个的商店创建者S
:传递S
的那个。config
在我看来,产生 a 的唯一方法StoreEnhancerStoreCreator
是从一个serialize
本身在S
. 我不确定这在你的场景中是否有意义。也许熟悉 Redux 的人会更好地了解该怎么做。
推荐阅读
- python - 如何递归地划分迷宫中的网格?
- mapbox - 使用 MySql 数据构建 MapBox 的信息
- r - 如何用两个类来调整 ggplot2 直方图,每个类都有独立的级别?
- javascript - 用JS给一个div添加自动刷新
- prometheus - 试图让我理解我从 Prometheus 中的 Rate 和 increase 函数中得到的东西
- reactjs - 样式化的组件样式未显示在 Gatsby 站点的样式标记内
- c# - OpenXML 更改默认跟踪更改设置
- machine-learning - 在机器学习算法的背景下,什么是“刷新率”?
- python - 如何制作具有多个根树的圆形树
- python - 如何更改启动画面中的图像