Javascript 正确打字
我基于创建了一个replace reducer,但是我使用的是typescript和redux文档没有任何关于如何正确键入replace reducer的示例,我尝试了一下,但是我的尝试覆盖了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
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>>;
};