Skip to content

Uso Avancado

Tree-Shaking com o Subpath de Erros

A entrada principal (@pbpeterson/typed-fetch) inclui todas as 40 classes de erro porque typedFetch precisa delas em tempo de execucao. Para consumidores que precisam apenas de classes de erro especificas (por exemplo, para verificacoes instanceof no proprio codigo), importe do subpath ./errors:

typescript
// Tree-shakeable — inclui apenas NotFoundError + BaseHttpError (~1KB)
import { NotFoundError } from '@pbpeterson/typed-fetch/errors';

// Importacao direta do arquivo
import { NotFoundError } from '@pbpeterson/typed-fetch/errors/not-found-error';

Usando statusCodeErrorMap

O statusCodeErrorMap exportado permite buscar classes de erro por codigo de status ou construir tratamento de erros personalizado:

typescript
import { statusCodeErrorMap } from '@pbpeterson/typed-fetch';

const ErrorClass = statusCodeErrorMap.get(404);
if (ErrorClass) {
  console.log(ErrorClass.name);       // "NotFoundError"
  console.log(ErrorClass.status);     // 404
  console.log(ErrorClass.statusText); // "Not Found"
}

Usando httpErrors

O array httpErrors contem todos os 40 construtores de classes de erro, util para iteracao:

typescript
import { httpErrors } from '@pbpeterson/typed-fetch';

for (const ErrorClass of httpErrors) {
  console.log(`${ErrorClass.status}: ${ErrorClass.statusText}`);
}

Corpos de Resposta de Erro

Todos os erros HTTP fornecem acesso ao corpo da resposta em multiplos formatos:

typescript
import { typedFetch, BadRequestError, isHttpError } from '@pbpeterson/typed-fetch';

const { error } = await typedFetch<User, BadRequestError>('/api/users', {
  method: 'POST',
  body: JSON.stringify(invalidData),
});

if (error && isHttpError(error)) {
  const json = await error.json();
  const text = await error.clone().text();
  const blob = await error.clone().blob();
  const buffer = await error.clone().arrayBuffer();

  // Acessar cabecalhos da resposta
  const contentType = error.headers.get('content-type');
  const retryAfter = error.headers.get('retry-after');

  // Tipos literais de status
  console.log(error.status);     // e.g. 400 (literal, not number)
  console.log(error.statusText); // e.g. "Bad Request" (literal, not string)
  console.log(error.name);       // e.g. "BadRequestError"
}

Erros de Rede vs HTTP

typescript
import { typedFetch, isHttpError, isNetworkError } from '@pbpeterson/typed-fetch';

const { error } = await typedFetch<User>('/api/users');

if (error) {
  if (isNetworkError(error)) {
    // NetworkError nao tem status — a requisicao nunca chegou ao servidor
    console.log('Connection failed:', error.message);
  } else if (isHttpError(error)) {
    // BaseHttpError tem status, statusText, headers e metodos de body
    console.log(`HTTP ${error.status}: ${error.statusText}`);
  }
}

RequestInit Opcional

O segundo parametro e opcional e tem como padrao {}:

typescript
// Estes sao equivalentes
await typedFetch<User[]>('/api/users');
await typedFetch<User[]>('/api/users', {});

Lançado sob a Licença MIT.