我正在尝试在基于 TypeScript 的 React Native 项目中使用 redux-thunk。我的操作定义为
export type Action<T> = {
type: T,
payload?: any
}
我的商店定义为
import { applyMiddleware, createStore } from 'redux'
import { persistStore } from 'redux-persist'
import thunk from 'redux-thunk'
import logger from 'src/redux/middleware/logger'
import rootReducer from 'src/redux/reducers'
export const store = createStore(rootReducer, applyMiddleware(logger, thunk))
export const persistor = persistStore(store)
我的操作构造函数定义为
export const setRepeat = (repeat: Repeating) => (
dispatch: Dispatch<Action>,
getState: () => AppState
) =>
dispatch<Action>({
payload: repeat,
type: actionTypes.SET_REPEAT,
})
Repeating
是一个简单的枚举:
export enum Repeating {
All = 'all',
None = 'none',
Single = 'single',
}
当我尝试用
store.dispatch(setRepeat('all' as Repeating))
我收到此错误
TS2345: Property 'type' is missing in type '(dispatch: Dispatch<Action<string>>, getState: () => AppState) => Action<string>' but required in type 'Action<string>'.
据我所知,这意味着setRepeat
正在返回一个函数(这是有道理的,这就是它的定义)。但是store.dispatch
并不期待像redux-thunk这样的功能,并且仍然期待Action
。
我似乎找不到任何解释为什么 thunk 没有在这里提供正确的类型,或者我需要做些什么来纠正这个问题。
- 反应原生:0.57.7
- 冗余:4.0.1
- 反应冗余:6.0.0
- Redux-thunk: 2.3.0
这个问题已经在 github 上提出
总而言之,您需要添加以下类型:
const store = createStore(
rootReducer,
applyMiddleware(
thunk as ThunkMiddleware<IState, Actions>, // this is crucial
));
下面的原始答案
这里的问题是dispatch
采用一种具有属性type
的Action<T>
类型,但您正在向其发送函数,而函数没有类型。请注意,setRepeat
是一个返回另一个函数的函数。
store.dispatch(setRepeat('all' as Repeating)(dispatcherInstance,getStateFunction))
我需要查看更多您的代码,但似乎您以错误的方式处理这个问题。