Type-safe API response handling helps you catch mistakes early by making sure the data you get from an API matches what you expect. This keeps your program safe and easier to fix.
Type-safe API response handling in Typescript
interface ApiResponse<T> {
data: T;
status: number;
message: string;
}
async function fetchData<T>(url: string): Promise<ApiResponse<T>> {
const response = await fetch(url);
if (!response.ok) {
throw new Error('Network error');
}
const json = await response.json();
return json as ApiResponse<T>;
}Use interface or type to define the expected shape of the API response.
Use generics <T> to make the function flexible for different data types.
User object.interface User {
id: number;
name: string;
}
interface ApiResponse<T> {
data: T;
status: number;
message: string;
}
async function fetchUser(): Promise<ApiResponse<User>> {
const response = await fetch('https://api.example.com/user');
if (!response.ok) {
throw new Error('Network error');
}
const json = await response.json();
return json as ApiResponse<User>;
}Product object from the API.interface Product {
id: number;
title: string;
price: number;
}
async function fetchProduct(): Promise<ApiResponse<Product>> {
const response = await fetch('https://api.example.com/product');
if (!response.ok) {
throw new Error('Network error');
}
const json = await response.json();
return json as ApiResponse<Product>;
}async function fetchData<T>(url: string): Promise<ApiResponse<T>> { const response = await fetch(url); if (!response.ok) { throw new Error('Network error'); } const json = await response.json(); return json as ApiResponse<T>; }
This program fetches a user from a public API and uses a type-safe response structure. It prints the status, message, and user details if successful, or an error message if something goes wrong.
interface ApiResponse<T> {
data: T;
status: number;
message: string;
}
interface User {
id: number;
name: string;
}
async function fetchUser(): Promise<ApiResponse<User>> {
const response = await fetch('https://jsonplaceholder.typicode.com/users/1');
if (!response.ok) {
throw new Error('Failed to fetch user');
}
const userData = await response.json();
return {
data: { id: userData.id, name: userData.name },
status: response.status,
message: 'User fetched successfully'
};
}
fetchUser()
.then(result => {
console.log(`Status: ${result.status}`);
console.log(`Message: ${result.message}`);
console.log(`User ID: ${result.data.id}`);
console.log(`User Name: ${result.data.name}`);
})
.catch(error => {
console.error('Error:', error.message);
});Always check if the network response is okay before using the data.
Type assertions like as ApiResponse<T> tell TypeScript what to expect but do not check data at runtime.
For full safety, consider validating the data shape at runtime using libraries like zod or io-ts.
Type-safe API response handling helps catch errors early by defining expected data shapes.
Use TypeScript interfaces and generics to describe API responses clearly.
Always handle possible errors like network failures or unexpected data.