reduxjs/redux

TS conflict between AppThunk and createAsyncThunk.withTypes

zshuzh opened this issue · 2 comments

zshuzh commented

What docs page needs to be fixed?

In the Redux Docs > Usage With Typescript > Type Checking Redux Thunks, it recommends using the following to type thunks:

export type AppThunk<ReturnType = void> = ThunkAction<
  ReturnType, // return type of the thunk function
  RootState, // state type used by getState
  unknown, // any "extra argument" injected into the thunk
  UnknownAction // known types of actions that can be dispatched
>

In the RTK Docs > Usage with Typescript > Defining a Pre-Typed createAsyncThunk, it recommends the following to type createAsyncThunk:

const createAppAsyncThunk = createAsyncThunk.withTypes<{
  state: RootState
  dispatch: AppDispatch
  rejectValue: string
  extra: { s: string; n: number }
}>()

I'm using both of these in my apps, but when I try to dispatch a thunk created using createAppAsyncThunk from a regular thunk, it's flagging a type error.

What is the problem?

From what I can see, it seems the two approaches type dispatch differently. The first approach (with AppThunk) types the dispatch parameter as ThunkDispatch<RootState, unknown, UnknownAction> but the second approach (with createAsyncThunk.withTypes) types the dispatch parameter as ThunkDispatch<RootState, undefined, UnknownAction> which is causing a problem,

What should be changed to fix the problem?

I was able to fix the problem like this:

export type AppThunk<ReturnType = void> = ThunkAction<
  ReturnType,
  RootState,
  undefined, // changed this from unknown to undefined
  UnknownAction
>

are you specifically providing extra: undefined as one of the keys in your ThunkApiConfig for .withTypes? if you don't provide it, it should default to unknown.