I hope everyone is doing great this weekend!
disclaimer: I already researched the whole day and I am coming to ask for help only after I tried many things, I opened more than 20 StackOverflow links and read through them...
I have this custom redux middleware that serves the purpose of capturing promises that fail and dispatches an action for each.
const errorMiddleware: Middleware =
({ dispatch }: MiddlewareAPI) =>
(next: Dispatch) =>
async (action: AnyAction) => {
const { meta, payload } = action;
const { withErrorHandler, defaultErrorCode } = meta;
const isPromise = getIsPromise(payload);
if (isPromise && withErrorHandler) {
return next(action)
.catch(errorHandler(defaultErrorCode))
.catch((handledError: ISystemError) =>
Promise.reject(
handledError.shouldSkipHandleError
? handledError
: dispatch(addError(handledError))
)
);
}
return next(action);
};
the problem I am trying to solve is the async (action: AnyAction) => {
I get an error message saying
Argument of type 'AsyncThunkAction<number, number, {}>' is not assignable to parameter of type 'AnyAction'.
Property 'type' is missing in type 'AsyncThunkAction<number, number, {}>' but required in type 'AnyAction'. TS2345
53 | <button
54 | className={styles.asyncButton}
> 55 | onClick={() => dispatch(incrementAsync(incrementValue))}
| ^
56 | >
57 | Add Async
58 | </button>
this is because incrementAsync
uses createAsyncThunk
from '@reduxjs/toolkit';
export const incrementAsync = createAsyncThunk(
'counter/fetchCount',
async (amount: number) => {
const response = await fetchCount(amount);
// The value we return becomes the `fulfilled` action payload
return response.data;
}
);
So I believe I need to change the last function ``async (action: AnyAction) => {` type of action to something else, but I can't figure it out, may I have the enlightenment of your words?
here is a link for the typescript playground if it helps
Try it with
const errorMiddleware: Middleware<{}, unknown, ThunkDispatch<unknown, unknown, AnyAction>> =
({ dispatch }) =>
(next) =>
async (action) => {
no need to type things left and right of the =
- typing it on one side will carry over to the other side.