When using axios with TypeScript, one major problem we face is the types for the response data and error data.
Consider the below function, which uses axios.post
async function postHello() {
try {
const response = await axios.post('/hello', {});
console.log(response.data);
} catch (error) {
console.log(error.response.data.status);
}
}
In the above function, the type of data will be any which can’t ensure the type safety.
To avoid this situation, we can provide the axios with our custom type for the response data and error data.
Add type for response data
First, let’s look into the Response data.
type PostHelloResponseType = {
status: string;
id: number;
};
async function postHello() {
try {
const response = await axios.post<PostHelloResponseType>('/hello', {});
console.log(response.data.status);
} catch (error) {
console.log(error.response.data.status);
}
}
We defined PostHelloResponseType for the expected response and pass it to axios.post.
Now, when we the response.data will have the type PostHelloResponseType

And TS will throw error if we try to use a non-existing key like response.data.stats.

Next, we will look into error data type.
Add type for error data
In TS, the error we receive in try...catch block will always have type unknown.
So we won’t be able to assign type in catch instead we have to define new variable.
import axios, { AxiosError, isAxiosError } from 'axios';
type PostHelloErrorType = {
status: string;
message: string;
type: string;
errors: string[];
};
async function postHello() {
try {
// call axios methods
} catch (error) {
if (isAxiosError(error)) {
const err: AxiosError<PostHelloErrorType> = error;
console.log(err.response.data.message);
}
}
}
Now we have type safety for the error data.

Happy coding.