16

I'm using Typescript with RTK mutation everything is working good but if I send any error from backend in specific JSON format like:

{ 
   status: "Error",
   message "Something went wrong"
}

When I check on my browser network tab its showing me the correct error response like:

{
   data: { 
      status: "Error",
      message "Something went wrong"
    }
}

I'm getting error in the mutation hook:

const [createCategory, {isLoading, error }] = useCreateCategoryMutation();

but I can't access error.data.message in my react it is giving me types error like:

Property 'data' does not exist on type 'FetchBaseQueryError | SerializedError'.

Brian Tompsett - 汤莱恩
  • 5,753
  • 72
  • 57
  • 129
Obaid Aqeel
  • 199
  • 1
  • 1
  • 10

3 Answers3

20

At this point, it could be an error from the server (FetchBaseQueryError) or just any error thrown by code you wrote (SerializedError, e.g. in query, queryFn, transformResponse etc.) - and that could have a completely different shape.

To make sure it's a FetchBaseQueryError, just do

if ('data' in error) {
  // TypeScript will handle it as `FetchBaseQueryError` from now on.
}
phry
  • 35,762
  • 5
  • 67
  • 81
7

I found the answer for your question here written by Phry as well :) ,

https://github.com/rtk-incubator/rtk-query/issues/86#issuecomment-738845312

If you know the format that will be returned with all non-2xx-status responses from your server, you could just cast your

fetchQuery as BaseQueryFn<string | FetchArgs, unknown, YourErrorType, {}>.

enter image description here

  • 1
    I've tried your suggestion and I've made custom ServerError type. However there's still an union with SerializedError done somewhere so it gives me the output: Property 'data' does not exist on type 'ServerError | SerializedError'. Property 'data' does not exist on type 'SerializedError'. – Tomasz Sikora Oct 08 '22 at 12:29
  • finally, how to solve it? – Sujon Hossain Dec 12 '22 at 14:57
0

I ended up working around it in the component itself In my case I needed the error to be of type Record<string, string>

// In the component arrow function where I use the RTK Query hook
const [register, { error }] = useRegisterMutation();
const errors = (): Record<string, string> => {
    if (error && (error as Record<string, string>)) {
      return error as Record<string, string>;
    } else {
      return {};
    }
  };

// In the rest of the code, I can just call
errors().propertyName // and check if it is undefined where I need to

I don't believe this is ideal, but did not figure out better work around so far

Ahmed
  • 938
  • 7
  • 16