Garanta sua assinatura com até 30%OFF antes do reajuste. Quero aproveitar
Como consumir APIs no front-end de forma otimizada usando OpenAPI e código tipado

Rocketseat

Navegação Rápida:
Se você é desenvolvedor front-end, provavelmente já passou pelo dilema de integrar APIs manualmente: descobrir rotas, parâmetros, formatos de requisição, lidar com erros… tudo isso sem a devida tipagem, o que aumenta bastante a chance de bugs. Fica aquela sensação de que estamos “adivinhando” como a API realmente funciona — e qualquer mudança no back-end pode virar uma dor de cabeça.
Felizmente, existe uma solução que transforma essa realidade: a geração automática de código tipado a partir de uma especificação OpenAPI (Swagger). Em vez de escrever
fetch
ou axios
a cada endpoint, podemos automatizar esse processo e trabalhar com tipos TypeScript que refletem exatamente o contrato estabelecido pelo back-end.Tipagem automática com OpenAPI
A documentação de APIs com OpenAPI (Swagger) é um verdadeiro divisor de águas. Ela atua como um contrato entre o back-end e o front-end, especificando rotas, tipos de dados, parâmetros e possíveis erros. Mas por que parar apenas na documentação? Ao gerar código de forma automática:
- Segurança em tempo de compilação: o TypeScript avisa caso você envie parâmetros errados ou tente acessar campos inexistentes na resposta.
- Produtividade: você escreve menos boilerplate — o código repetitivo de integração.
- Sincronia: toda vez que o back-end mudar, basta atualizar a especificação OpenAPI e regenerar o cliente front-end.
- Autocompletar e intellisense: a IDE sugere rotas, parâmetros e respostas possíveis.
Essa abordagem elimina grande parte dos erros em tempo de execução e facilita a refatoração quando o back-end evolui.
Conhecendo as ferramentas: um arsenal para dominar as APIs
Existem várias bibliotecas que nos permitem gerar código a partir de uma especificação OpenAPI. Além das quatro que vamos explorar em detalhes, vale uma breve menção ao OpenAPI Generator. Trata-se de uma ferramenta poderosa e amplamente utilizada, capaz de gerar código para diversos clients e servers, em várias linguagens. No entanto, como nosso foco é em ferramentas mais específicas para o desenvolvimento front-end com JavaScript/TypeScript e que ofereçam integrações mais diretas com frameworks como React, vamos dar prioridade a soluções como OpenAPI TypeScript, HeyAPI, Orval e Kubb, que contam com uma arquitetura e recursos mais alinhados com as necessidades desse ecossistema.
1. OpenAPI TypeScript
O OpenAPI TypeScript é uma solução básica para gerar definições de tipos diretamente de um arquivo de especificação OpenAPI. Ele é simples e focado em gerar apenas as tipagens, deixando sob seu controle a forma de fazer as requisições.
Exemplo de uso com:
openapi-typescript
npx openapi-typescript ./openapi.json -o ./src/api.ts
Ele gera um
api.ts
com todas as definições de tipos. Você pode usar tanto o fetch
nativo quanto integrá-lo a bibliotecas como React Query.// Exemplo fictício de tipagens que podem ser geradas export interface paths { '/users': { get: { responses: { 200: { content: { 'application/json': User[]; }; }; }; }; }; // ... } export interface User { id: string; name: string; email: string; }
Para consumir no React com React Query:
import { useQuery } from 'react-query'; import { paths } from './api'; function fetchUsers(): Promise<paths['/users']['get']['responses']['200']['content']['application/json']> { return fetch('https://api.meuservidor.com/users').then(res => res.json()); } export function UserList() { const { data, isLoading } = useQuery('users', fetchUsers); if (isLoading) return <div>Carregando...</div>; return ( <ul> {data?.map(user => ( <li key={user.id}>{user.name}</li> ))} </ul> ); }
Prós
- Simples e fácil de instalar.
- Gera tipagens fortes.
Contras
- Menos intuitivo para quem quer geração completa (requisições, hooks, etc.).
- Normalmente requer configuração adicional para uso em grandes projetos.
2. Hey API
Em crescimento, o Hey API aposta na flexibilidade com plugins. Ele pode gerar código para React Query, mock de dados para testes, entre outros.
Exemplo de configuração com
Hey API
:// openapi-ts.config.ts import { defineConfig } from '@hey-api/openapi-ts'; export default defineConfig({ schema: './openapi.json', output: { path: './src/http/generated', }, plugins: [ { name: 'react-query', // Gera hooks de React Query }, // Outros plugins (mocks, etc.) ], });
A ferramenta pode criar:
- Services: funções puras para requisição (fetch).
- Hooks de React Query.
- Arquivos de Tipos (para interfaces e enums).
No componente React:
import { useQuery } from 'react-query'; import { getGetUsersOptions } from './http/generated'; // Opções geradas export function UserList() { const { data, isLoading } = useQuery({ ...getGetUsersOptions(), // Chama a função gerada automaticamente }); if (isLoading) { return <div>Carregando...</div>; } return ( <ul> {data?.map(user => ( <li key={user.id}>{user.name}</li> ))} </ul> ); }
Prós
- Extensível (arquitetura de plugins).
- Integração nativa com React Query.
- Geração de mocks para testes.
Contras
- Projeto mais recente, menos robusto do que Orval.
- Comunidade menor (até o momento).
3. Orval
O Orval é bem conhecido e maduro. Conta com uma ampla comunidade e inúmeras integrações (Vue, React Query, Angular, Svelte, SWR, Axios, etc.). Permite personalizar praticamente todos os aspectos da geração de código.
Exemplo de configuração com
Orval
:// orval.config.js module.exports = { exemplo: { output: { mode: 'split', target: './src/api/generated.ts', schemas: './src/api/model', client: 'react-query', }, input: { target: './openapi.json', }, }, };
Ele gera funções nomeadas para cada endpoint, como
useGetUsers
e useCreateUser
, permitindo criar chamadas tipadas de forma fácil.No componente React:
// Exemplo no componente React import { useGetUsers, useCreateUser } from './api/generated'; function UserList() { const { data: users, isLoading } = useGetUsers(); const mutation = useCreateUser(); if (isLoading) return <div>Carregando...</div>; const handleCreateUser = (newUserData: any) => { mutation.mutate({ data: newUserData }); }; return ( <div> {users?.map(u => ( <li key={u.id}>{u.name}</li> ))} {/* Formulário de criação */} </div> ); }
Prós
- Maduro, com boa comunidade e mais estável.
- Altamente customizável.
- Integração com vários frameworks além de React.
Contras
- Ainda não exporta os tipos de erro do back-end de forma nativa (principal dor de cabeça para quem quer lidar com erros de forma robusta).
4. Kubb
O Kubb é uma ferramenta relativamente nova, mas que já se destaca pela arquitetura de plugins extremamente flexível. Ele gera arquivos separados para cada rota, integra-se com Zod (validações), React Query, Vue, Svelte, etc. — e promete lidar melhor com a tipagem de erros.
Exemplo de configuração com
Kubb
:// kubb.config.ts import { defineConfig } from '@kubb/core'; import swagger from '@kubb/swagger'; import swaggerTs from '@kubb/swagger-ts'; import swaggerTanstackQuery from '@kubb/swagger-tanstack-query'; import swaggerZod from '@kubb/swagger-zod'; export default defineConfig(() => { return { input: { path: './openapi.json', }, output: { path: './src/gen', clean: true, }, plugins: [ swagger({ output: false }), swaggerTs({ output: { path: 'models' } }), swaggerTanstackQuery({ output: { path: 'react-query' }, client: { importPath: '../client.ts', // Cliente customizado }, }), swaggerZod({ output: { path: 'zod' } }), ], }; });
Em
client.ts
, podemos personalizar o fetch para retornar uma tupla: [erro, dados]
.// client.ts export async function customFetch<TData, TError>( url: string, options: RequestInit ): Promise<[TError | null, TData | null]> { const response = await fetch(url, options); if (!response.ok) { // Lidar com erro retornado pela API const errorData = (await response.json()) as TError; return [errorData, null]; } const data = (await response.json()) as TData; return [null, data]; }
Dessa forma, cada requisição retorna uma tupla:
[error, data]
. Ao integrar com o React Query, o Kubb pode inferir tipos com precisão e, na hora de usar:import { useGetUsers } from './gen/react-query'; export function UserList() { const { data, isLoading } = useGetUsers(); // data é: [error, users] | undefined if (isLoading) return <div>Carregando...</div>; const [error, users] = data ?? [null, null]; if (error) { return <div>Erro: {error.message}</div>; } return ( <ul> {users?.map(user => ( <li key={user.id}>{user.name}</li> ))} </ul> ); }
Prós
- Altamente customizável, permitindo separar tudo em plugins.
- Integração com Zod, SWR, React Query, Vue, Svelte, etc.
- Pode gerar tipagem de erros bem detalhada, conforme a especificação OpenAPI.
Contras
- É muito novo, sujeito a mudanças.
- Comunidade ainda pequena, exigindo cautela em projetos grandes.
Como pudemos ver, cada uma dessas ferramentas — OpenAPI TypeScript, Hey API, Orval e Kubb — tem seu lugar e pode ser adotada em diferentes cenários. Em projetos mais simples ou para quem deseja apenas gerar as tipagens, o OpenAPI TypeScript cumpre bem o papel. Se a necessidade for contar com plugins, geração de mocks ou opções mais flexíveis, o Hey API se mostra uma alternativa interessante. Já o Orval e o Kubb trazem poderosas integrações e personalizações, sendo o primeiro mais maduro e o segundo uma escolha promissora para quem deseja ter ainda mais controle sobre a tipagem de erros.
Para resumir as principais diferenças e pontos de atenção, confira a tabela comparativa abaixo:
Ferramenta | Facilidade de Uso | Suporte a React Query | Tipagem de Erros | Flexibilidade |
OpenAPI TypeScript | ⭐⭐⭐ | ❌ | ✅ | Média |
Hey API | ⭐⭐⭐⭐ | ✅ | ✅ | Alta |
Orval | ⭐⭐⭐⭐⭐ | ✅ | ❌ | Muito Alta |
Kubb | ⭐⭐⭐ | ✅ | ✅ | Extremamente Alta |
Cada projeto tem necessidades e prioridades distintas — por isso, vale a pena analisar com cuidado a curva de aprendizado, a comunidade de suporte disponível e os recursos oferecidos por cada biblioteca.
Quer ir ainda mais a fundo? No próximo tópico, vamos falar sobre o poder das tuplas, mostrando como essas ferramentas podem ajudar (ou ser configuradas) para oferecer uma experiência de manipulação de erros mais clara, sem a verbosidade tradicional do
try...catch
. Essa abordagem faz toda a diferença quando lidamos com APIs que retornam erros complexos e queremos garantir a segurança e a clareza do código no front-end. Siga em frente para entender como tudo isso se encaixa!Lidando com erros de forma inteligente: o poder das tuplas
A tipagem de erros é um dos pontos mais sensíveis para desenvolvedores front-end. Ferramentas como o Orval, embora robustas, não exportam automaticamente todos os tipos de erros definidos pelo back-end.
Já o Kubb (e também configurações personalizadas em outras libs) podem retornar uma tupla:
[error, data]
. É uma abordagem inspirada em linguagens como Go, que eliminam a verbosidade de try...catch
quando precisamos tratar erros específicos para cada chamada.// Exemplo hipotético de verificação de erro const [error, data] = await createUserMutation.mutateAsync({ data: userInfo }); if (error) { // error é tipado de acordo com o que a API pode retornar console.error(error); return alert(`Erro: ${error.message}`); } // data não é nulo aqui, porque se chegou até esse ponto, deu certo console.log(`Usuário criado: ${data.name}`);
Essa técnica simplifica muito o fluxo, evitando
try...catch
aninhados e deixando o TypeScript trabalhar a nosso favor, pois ele sabe que, se error
existe, data
estará nulo (e vice-versa).Material extra para se aprofundar
Quer mergulhar ainda mais fundo no universo do OpenAPI e da geração de código para front-end? Confira esses recursos:
- OpenAPI (Swagger): https://swagger.io/specification/
- OpenAPI TypeScript: https://www.npmjs.com/package/openapi-typescript
- HEY API: https://heyapi.dev/
- Orval: https://orval.dev/
- Kubb: https://kubb.dev/
- OpenAPI Generator: https://openapi-generator.tech/
Conclusão: o futuro do consumo de APIs é tipado e automatizado
Chega de sofrer com a integração manual de APIs! Ao adotar a geração automática de código a partir de uma especificação OpenAPI, você vai transformar radicalmente a forma como trabalha no front-end. Diga adeus aos erros bobos, à verbosidade do
try...catch
e à falta de sincronia com o back-end. Abrace a tipagem forte, o autocompletar inteligente, a produtividade e a segurança que essa abordagem oferece.OpenAPI TypeScript, Hey API, Orval e Kubb são ferramentas poderosas que te colocam no caminho certo. O Orval é a escolha sólida para projetos grandes que precisam de estabilidade, apesar da limitação atual com a tipagem de erros. Já o Kubb é a grande promessa do futuro, com sua arquitetura flexível e tratamento de erros inovador, mas que ainda requer certa cautela por ser muito novo. Hey API e OpenAPI TypeScript são alternativas interessantes para projetos menores ou casos de uso específicos.
Agora é a sua vez! Não perca mais tempo! Explore as ferramentas que apresentamos, escolha a que melhor se encaixa nas suas necessidades e comece a desfrutar de um desenvolvimento front-end mais eficiente, robusto e, acima de tudo, prazeroso!
Dê o primeiro passo! Escolha uma das ferramentas, instale-a em seu projeto e gere seu primeiro cliente de API tipado hoje mesmo! Você vai se surpreender com a diferença que isso fará no seu dia a dia.
Compartilhe suas experiências, dúvidas e sugestões em nossa comunidade! Vamos juntos construir um ecossistema de desenvolvimento front-end cada vez melhor!
Quer se aprofundar ainda mais? Confira o vídeo do Diego para ver essas ferramentas em ação e uma discussão ainda mais detalhada sobre tipagem e tratamento de erros!
