Middle
Kako bi tipizovao odgovore backend-a u TypeScript-u ako jedan endpoint može vraćati različite strukture: listu sa paginacijom, grešku ili prazan rezultat? Kako organizovati tipove da budu lako upotrebljivi u celom projektu?
sobes.tech АИ
Одговор од АИ
Для типизации ответов backend, которые могут возвращать разные структуры (например, список с пагинацией, ошибку или пустой результат), удобно использовать объединения (union types) и интерфейсы в TypeScript.
Пример организации типов:
interface Pagination {
page: number;
pageSize: number;
total: number;
}
interface Item {
id: string;
name: string;
// другие поля
}
interface SuccessResponse {
data: Item[];
pagination: Pagination;
}
interface EmptyResponse {
data: [];
pagination: Pagination;
}
interface ErrorResponse {
error: string;
code: number;
}
// Объединенный тип ответа
type ApiResponse = SuccessResponse | EmptyResponse | ErrorResponse;
// Пример функции обработки ответа
function handleResponse(response: ApiResponse) {
if ('error' in response) {
console.error('Ошибка:', response.error);
} else if (response.data.length === 0) {
console.log('Пустой результат');
} else {
console.log('Данные:', response.data);
}
}
Такой подход позволяет:
- Четко описать каждую возможную структуру ответа.
- Использовать проверку по наличию ключей (например,
error), чтобы определить тип ответа. - Удобно использовать типы по всему проекту, импортируя их из одного файла с типами.
Если ответов много и они сложные, можно дополнительно использовать дженерики и утилиты для переиспользования общих частей типов.