【发布时间】:2019-12-19 16:15:43
【问题描述】:
我正在使用来自 React-Redux 的 useSelector(state => state.SLICE_NAME) 钩子,但是我在定义 state 参数时遇到了困难。默认设置为unknown,所以当我尝试返回state.SLICE_NAME (Error: Object is of type 'unknown') 时出现错误。
如何定义 state 类型,而无需手动创建单独的状态类型并在创建每个新状态定义时添加它们?
我尝试将状态定义为typeof store,但这不起作用。
一些代码来帮助解释:
// navDrawer.ts
import { createSlice } from "redux-starter-kit";
// navDrawer initial state
export interface NavDrawerInitialState {
open: boolean;
}
const navDrawerInitialState: NavDrawerInitialState = {
open: false
};
// Create state slice
const { actions, reducer } = createSlice({
slice: "navDrawer",
initialState: navDrawerInitialState,
reducers: {
open: (state: NavDrawerInitialState) => {
state.open = true;
},
close: (state: NavDrawerInitialState) => {
state.open = false;
}
}
});
export const navDrawerActions = actions;
export default reducer;
// reducers.ts
import navDrawer from "./navDrawer";
const reducers = {
navDrawer
};
export default reducers;
// store.ts
import { configureStore } from "redux-starter-kit";
import reducer from "./reducers";
const store = configureStore({
reducer
});
export default store;
// Page.tsx
import React, { FC } from "react";
import { Provider } from "react-redux";
import store from "./store";
import ChildComponent from "./ChildComponent";
const StateProvider: FC = () => {
return <Provider store={store}><ChildComponent /></Provider>;
};
export default StateProvider;
// ChildComponent.tsx
import React, { FC } from "react";
import { useSelector } from "react-redux";
const ChildComponent: FC = () => {
const navDrawerState = useSelector(state => state.navDrawer); // ERROR OCCURS HERE. "state" is defined as 'unknown' so "state.navDrawer" throws an error.
return <div>Text</div>
}
编辑:我注意到configureStore() 的类型定义包含作为第一个泛型类型的状态。请参阅下面的屏幕截图。如果我可以从EnhancedStore 获得第一个通用值,那么我将能够使用它来定义状态。有什么办法可以在 Typescript 中做到这一点?
【问题讨论】:
-
自从提出这个问题以来发生了很多变化。 stackoverflow.com/a/65049635/3233055 是目前“最”正确的答案。 @Jake 你应该选择一个答案。
标签: typescript redux react-redux