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', {});