Skip to content

typedFetch

Wrapper type-safe sobre a API fetch nativa que retorna erros como valores em vez de lancar excecoes.

Assinatura

typescript
function typedFetch<
  JsonReturnType,
  ErrorType extends ClientErrors = ClientErrors,
>(
  url: Parameters<typeof fetch>[0],
  options?: Parameters<typeof fetch>[1] & {
    headers?: TypedHeaders;
    method?: HttpMethods;
  },
): Promise<
  | { response: TypedResponse<JsonReturnType>; error: null }
  | { response: null; error: ErrorType | ServerErrors | NetworkError }
>

Parametros de Tipo

ParametroDescricao
JsonReturnTypeTipo esperado do corpo da resposta em caso de sucesso
ErrorTypeTipos de erro de cliente especificos esperados (padrao: todos os 4xx). Erros de servidor (5xx) e NetworkError sao sempre incluidos.

Parametros

ParametroTipoDescricao
urlstring | URL | RequestA URL do recurso, igual ao fetch()
optionsRequestInitOpcoes da requisicao com headers e method tipados (opcional, padrao {})

Tipo de Retorno

Uma discriminated union — verifique error para restringir:

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

if (error) {
  // response e null, error e ErrorType | ServerErrors | NetworkError
} else {
  // error e null, response e TypedResponse<User>
  const user = await response.json(); // Type: User
}

Compatibilidade com a API Fetch

typedFetch tem a mesma API do fetch nativo:

  • Todas as opcoes do fetch funcionam: method, headers, body, credentials, cache, etc.
  • Suporte completo ao AbortController via signal
  • Timeout de requisicao usando AbortSignal.timeout()
  • Mesmos tipos de parametros do fetch nativo
  • Substituicao direta para chamadas fetch existentes

isHttpError

typescript
function isHttpError(error: unknown): error is BaseHttpError

Type guard que verifica se um valor e um erro HTTP (qualquer subclasse de BaseHttpError). Prefira isso ao instanceof quando o erro pode cruzar limites de pacotes.

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

if (isHttpError(error)) {
  console.log(error.status, error.statusText, error.name);
}

isNetworkError

typescript
function isNetworkError(error: unknown): error is NetworkError

Type guard que verifica se um valor e um NetworkError.

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

if (isNetworkError(error)) {
  console.log('Connection failed:', error.message);
}

statusCodeErrorMap

typescript
const statusCodeErrorMap: Map<number, HttpErrors>

Mapeia codigos de status HTTP (400-511) para seus construtores de classes de erro correspondentes.

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

const ErrorClass = statusCodeErrorMap.get(404); // NotFoundError

httpErrors

typescript
const httpErrors: readonly [BadGatewayError, BadRequestError, ...]

Array com todos os 40 construtores de classes de erro HTTP. Util para iteracao e registros personalizados.

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

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

Exemplos

Cancelamento de Requisicao

typescript
const controller = new AbortController();

const { response, error } = await typedFetch<User[]>('/api/users', {
  signal: controller.signal,
});

controller.abort();

Timeout de Requisicao

typescript
const { response, error } = await typedFetch<User[]>('/api/users', {
  signal: AbortSignal.timeout(5000),
});

POST com Typed Headers

typescript
const { response, error } = await typedFetch<User>('/api/users', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer token',
  },
  body: JSON.stringify(userData),
  credentials: 'include',
});

Lançado sob a Licença MIT.