Say I have code like so:
import { Action, Dispatch } from 'redux';
import { ThunkAction } from 'redux-thunk';
interface StateTree {
field: string;
}
function myFunc(action: Action | ThunkAction<void, StateTree, void>,
dispatch: Dispatch<StateTree>) {
dispatch(action); // <-- This is where the error comes from
}
...I get this error from the TypeScript compiler:
ERROR in myFile.ts:x:y
TS2345: Argument of type 'Action | ThunkAction<void, StateTree, void>' is not assignable to parameter of type 'Action'.
Type 'ThunkAction<void, StateTree, void>' is not assignable to type 'Action'.
Property 'type' is missing in type 'ThunkAction<void, StateTree, void>'.
I believe the problem is because of the way the redux-thunk
type definition file augments the redux
Dispatch
interface and the inability for TypeScript to know which definition of Dispatch
to use.
Is there a way around this?
ThunkAction signature changed with latest version (now is
ThunkAction<void, Your.Store.Definition, void, AnyAction>
) and unless some evil double casting (action as {} as Action
), the more elegant way I found is to define the redux dispatch as a ThunkDispatch like this:In case someone else is looking for an updated answer! ^^
These are the correct typings: https://github.com/reduxjs/redux-thunk/blob/master/test/typescript.ts
Most notably:
applyMiddleware
will already override the dispatch with aThunkDispatch
.I think you are correct in that despite being able to handle both types, typescript cannot work out which overload to use.
I think the best option for you is to cast back to the desired type when calling
dispatch
I hope I'm wrong and there is a better way to achieve this.