Skip to content

Typed FetchCliente HTTP type-safe que nunca lança exceções

Inspirado no padrão de tratamento de erros do Go, construído sobre a API Fetch nativa

Exemplo Rápido

typescript
import { typedFetch, NotFoundError, UnauthorizedError, NetworkError } from '@pbpeterson/typed-fetch';

interface User {
  id: number;
  name: string;
  email: string;
}

// Especifique erros de cliente esperados para melhor segurança de tipos
type ExpectedErrors = NotFoundError | UnauthorizedError;
const { response, error } = await typedFetch<User[], ExpectedErrors>('/api/users');

if (error) {
  // Aqui, response é null e error contém o erro específico
  if (error instanceof NotFoundError) {
    console.log('Usuários não encontrados');
  } else if (error instanceof UnauthorizedError) {
    console.log('Autenticação necessária');
  } else if (error instanceof NetworkError) {
    console.log('Erro de rede:', error.message);
  } else {
    // Erros de servidor (5xx) são sempre incluídos
    console.log(`HTTP ${error.status}: ${error.statusText}`);
  }
} else {
  // Aqui, error é null e response contém o resultado bem-sucedido
  const users = await response.json(); // Tipo: User[]
  console.log('Usuários:', users);
}

Por que typed-fetch?

Bibliotecas fetch tradicionais lançam exceções em erros HTTP, tornando o tratamento de erros complicado e propenso a falhas. typed-fetch segue a filosofia do Go de tratamento de erros explícito - erros são valores, não exceções.

typescript
try {
  const response = await fetch('/api/users');
  const users = await response.json(); // E se a resposta for 404?
} catch (error) {
  // Lidar com erros de rede, erros de parsing, erros HTTP... tudo misturado
}
typescript
import { NotFoundError, UnauthorizedError } from '@pbpeterson/typed-fetch';

// Especifique erros esperados para melhor segurança de tipos
type ExpectedErrors = NotFoundError | UnauthorizedError;
const { response, error } = await typedFetch<User[], ExpectedErrors>('/api/users');

if (error) {
  // Aqui: error tem o erro específico, response é null
  if (error instanceof NotFoundError) {
    console.log('Endpoint de usuários não encontrado');
  } else if (error instanceof UnauthorizedError) {
    console.log('Autenticação necessária');
  } else {
    console.log(`Erro do servidor ${error.status}: ${error.statusText}`);
  }
  const errorDetails = await error.json(); // Acessar corpo da resposta de erro
} else {
  // Aqui: response tem os dados, error é null
  // TypeScript sabe que response não é null
  const users = await response.json(); // Tipo: User[]
}

Instalação

bash
npm install @pbpeterson/typed-fetch
bash
pnpm add @pbpeterson/typed-fetch
bash
yarn add @pbpeterson/typed-fetch

Pronto para começar?

Confira o guia Primeiros Passos para aprender a usar typed-fetch no seu projeto.

Lançado sob a Licença MIT.