type ApiResponse<T> = { success: true; data: T } | { success: false; error: string };
async function fetchApi<T>(url: string): Promise<ApiResponse<T>> {
try {
const response = await fetch(url);
if (!response.ok) {
return { success: false, error: `HTTP ${response.status}` };
}
const data: T = await response.json();
return { success: true, data };
} catch (error) {
return { success: false, error: (error as Error).message };
}
}Usage
interface User {
id: number;
name: string;
}
const result = await fetchApi<User>('/api/user/1');
if (result.success) {
console.log(result.data.name); // Type-safe access
} else {
console.error(result.error);
}