The payloadCreator argument to createAsyncThunk
takes two arguments. The first is a single arg
that receives data passed into the thunk's action creator such as dispatch(checkout(items))
. The second is called thunkAPI
that contains something like 7 different methods on it. Here we're going to use its getState()
method to access the global state just before we make complete the checkout API call.
When it comes to typing createAsyncThunk
just like other RTK methods, it will mostly be typed by default. In this case we still need to tell it about our store. We can do that with thunkAPI.getState() as RootState
which I think is the preferred way to handle the types here. If we really want to be thorough though, we can pass in the full types like this:
createAsyncThunk<
PayloadResponse,
ThunkArgument,
{ state: RootState }
>("slice/typeName", payloadCreator)
Jamund Ferguson: [0:00] Open up cartSlice.ts and head into the createAsyncThunk() method. I'm going to rename the argument CartItems to _ and add a second argument. This one's called thunkAPI.
[0:09] In the first line of our function let's type const state = thunkAPI.getState(), and below that const items = state.cart.items. Then in Cart.tsx, when we call checkoutCart(), we don't need to pass in the items any longer. We're pulling it directly from the current state.
[0:28] The only problem with this approach is that TypeScript doesn't understand what's happening. In order to type this properly, we can say here const state = getState() as RootState, which will correct the type issue, or we can fully type this createAsynkThunk() method using the generic syntax here.
[0:47] First, it needs to know the checkout response, which in this case is going to be success: boolean. Then, it wants to know the type of your first argument. In this case, that would be our _ argument, which is currently undefined because we're no longer passing the cart items.
[1:00] The third argument here is going to be an object with the property of state, and that is going to be of type RootState.
[1:06] It looks something like this when it's all typed out, but with that, we will have full type support by TypeScript. This works fine, but it's easier just to tell it that state is RootState and then all of our types work perfectly.