Javascript 正确打字

Javascript 正确打字,javascript,reactjs,typescript,redux,react-redux,Javascript,Reactjs,Typescript,Redux,React Redux,我基于创建了一个replace reducer,但是我使用的是typescript和redux文档没有任何关于如何正确键入replace reducer的示例,我尝试了一下,但是我的尝试覆盖了useStore忽略了失去getState()键入的泛型 组成部分: interface State { sim: number; nao: string; } function Experimente() { const store: InjectableStore = useStore&l

我基于创建了一个replace reducer,但是我使用的是typescript和redux文档没有任何关于如何正确键入replace reducer的示例,我尝试了一下,但是我的尝试覆盖了
useStore
忽略了失去
getState()
键入的泛型

组成部分:

interface State {
  sim: number;
  nao: string;
}

function Experimente() {
  const store: InjectableStore = useStore<State>();
  const dispatch = useDispatch();

  store.getState(); // any
}
类型定义:

export interface WithAsync {
  injectPageReducer?: (asyncReducer: Reducer) => void;
  asyncReducers?: IGenericObject<any>;
  replaceReducer?: typeof combineReducers;
}

export type InjectableStore = ReturnType<typeof useStore> & {
  injectPageReducer?: WithAsync['injectPageReducer']
}
使用异步导出接口{
injectPageReducer?:(asyncReducer:Reducer)=>void;
异步减速器?:IGenericObject;
更换减速器?:组合减速器的类型;
}
导出类型InjectableStore=ReturnType&{
injectPageReducer?:WithAsync['injectPageReducer']
}

如何键入保持
useStore
类型的
replaceReducer
策略?

问题是您的类型
InjectableStore
没有收到任何有关您的存储的信息。类型
ReturnType
不会应用您的特定状态类型,因为
useStore
是泛型的,但您没有为它提供泛型参数,因此它使用自己的默认值。
useState
的签名为:

export function useStore<S = RootStateOrAny, A extends Action = AnyAction>(): Store<S, A>;
快速修复方法是将
page
设置为
State
上的可选属性,但这会导致错误。最好将其设为必需并设置默认值

实际上,我不喜欢将
asyncReducers
设置为
Store
的属性,而不是传递给
replaceReducer
的临时变量,但我看到它直接来自,所以我将继续使用它

我用Async去掉了
,将它做成了一个
InjectableStore
接口,该接口具有
存储
以及(可能)您的两个附加组件的所有属性。由于附加组件是可选的,因此在调用它之前需要检查
injectPageReducer
是否存在

export type InjectableStore = Store<State, MyAction> & {
  injectPageReducer?: (pageReducer: Reducer<PageState, MyAction>) => void;
  asyncReducers?: Partial<ReducersMapObject<State, MyAction>>;
};
导出类型InjectableStore=Store&{
injectPageReducer?:(pageReducer:Reducer)=>无效;
异步还原器?:部分;
};
export interface Store<S = any, A extends Action = AnyAction> {
  /** ... */
  replaceReducer(nextReducer: Reducer<S, A>): void
  /** ... */
}
export type InjectableStore = Store<State, MyAction> & {
  injectPageReducer?: (pageReducer: Reducer<PageState, MyAction>) => void;
  asyncReducers?: Partial<ReducersMapObject<State, MyAction>>;
};