Middle
Como tipificarias as respostas do backend em TypeScript se um endpoint pode retornar diferentes estruturas: uma lista com paginação, um erro ou um resultado vazio? Como organizarias os tipos para que seja fácil de usar em todo o projeto?
sobes.tech IA
Resposta da IA
Для типизации ответов 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), чтобы определить тип ответа. - Удобно использовать типы по всему проекту, импортируя их из одного файла с типами.
Если ответов много и они сложные, можно дополнительно использовать дженерики и утилиты для переиспользования общих частей типов.