【发布时间】:2018-11-17 16:56:37
【问题描述】:
我正在创建一个 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 上定义的泛型参数连接起来?
【问题讨论】:
标签: typescript generics higher-order-functions