Sobes.tech
Middle

¿Cómo tipificarías las respuestas del backend en TypeScript si un endpoint puede devolver diferentes estructuras: una lista con paginación, un error o un resultado vacío? ¿Cómo organizarías los tipos para que sea fácil de usar en todo el proyecto?

sobes.tech AI

Respuesta de la 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), чтобы определить тип ответа.
  • Удобно использовать типы по всему проекту, импортируя их из одного файла с типами.

Если ответов много и они сложные, можно дополнительно использовать дженерики и утилиты для переиспользования общих частей типов.