首页 > 解决方案 > 如何关联高阶函数之间定义的泛型类型?

问题描述

我正在创建一个 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

标签: typescriptgenericshigher-order-functions

解决方案


问题是storage被声明为(间接地,通过StoreEnhancer)返回 a StoreEnhancerStoreCreator,这是一个必须为 all 工作的通用函数S。但是,给定的调用会storage产生一个仅适用于一个的商店创建者S:传递S的那个。config

在我看来,产生 a 的唯一方法StoreEnhancerStoreCreator是从一个serialize本身在S. 我不确定这在你的场景中是否有意义。也许熟悉 Redux 的人会更好地了解该怎么做。


推荐阅读