JSON para TypeScript Interface
Conversor online gratuito JSON para TypeScript. Cole JSON e obtenha interfaces estritas com objetos aninhados, arrays e uniões. Privado, no navegador.
Sobre o Gerador JSON para TypeScript
Gera interfaces TypeScript estritas e idiomáticas a partir de qualquer amostra JSON. Útil quando você precisa tipar respostas de API, configurar entradas tRPC, validar dados localStorage ou migrar uma codebase JavaScript para TypeScript sem escrever cada forma à mão.
O gerador infere tipos a partir de valores, lida com objetos aninhados, constrói sub-interfaces nomeadas, mescla formas de elementos de array, suporta campos nullable e oferece três estilos de declaração.
Por que gerar interfaces TypeScript a partir de JSON em vez de escrevê-las à mão?
Três razões pragmáticas. Primeiro, precisão sob mudança — quando uma API retorna uma resposta real, a interface gerada corresponde à forma atual, incluindo cada nome de campo, tipo e ponto nullable que você pode esquecer à mão. Segundo, velocidade — uma resposta de API de 200 campos que leva 30 minutos para tipar manualmente é gerada em uma única colagem. Terceiro, consistência entre equipes — múltiplos desenvolvedores escrevendo a mesma interface a partir de documentos de API invariavelmente discordam sobre campos opcionais, casing e formas aninhadas. Cuidados: tipos gerados se prendem aos dados de amostra que você forneceu.
Como a ferramenta lida com objetos aninhados, arrays de objetos e arrays de tipos mistos?
Objetos aninhados se tornam suas próprias interfaces nomeadas, derivadas do nome do campo (camelCase ou snake_case se torna PascalCase: address → Address, user_profile → UserProfile). Se um nome colide com uma interface existente que tem forma diferente, a ferramenta anexa um número (Address, Address2). Arrays de primitivos se tornam T[]. Arrays de objetos se tornam Item[] onde Item é uma interface gerada que mescla todos os campos através dos elementos do array. Arrays de tipos mistos se tornam tipos união: (string | number | boolean)[]. Arrays vazios padrão são unknown[].
Qual a diferença entre interface e type aliases, e qual devo usar?
Funcionalmente similares para formas de objeto, mas com diferenças-chave. Interfaces suportam declaration merging — declarar interface User { name: string } duas vezes e TypeScript as mescla. Type aliases não suportam mesclagem. Interfaces podem ser estendidas via sintaxe extends; tipos compõem via interseção (&) e união (|). Type aliases podem ter alias de tipos não-objeto (type ID = string | number) e uniões primitivas. Desempenho: idêntico para tipos de objeto em TypeScript moderno. Convenção em 2026: a maioria das equipes prefere interface para contratos de API públicos e type para tipos utilitários, uniões e tipos computados.
Como lidar com campos que às vezes são null, às vezes um valor, em APIs reais?
APIs reais retornam null para campos que ainda não têm um valor (lastLogin: null quando o usuário nunca fez login). O modo estrito do TypeScript exige que você lide com isso explicitamente. Três padrões oferecidos por este gerador: (1) Tipos estritos — se o valor de amostra é null, o tipo se torna null literalmente. (2) Marcar null como nullable — campos null se tornam T | null onde T é unknown. (3) Todos os campos opcionais — cada campo se torna opcional. Melhor prática de produção: gerar a partir de uma resposta onde o campo tem um valor real, depois editar manualmente o tipo para T | null onde você sabe que o campo às vezes é null.
Posso gerar tipos diretamente de uma resposta de API ou tenho que colar JSON toda vez?
Esta ferramenta exige que você cole JSON manualmente — ela roda inteiramente no seu navegador sem acesso à rede. Fluxo de trabalho pretendido: use DevTools do navegador ou uma ferramenta como Postman / Insomnia / Hoppscotch para capturar uma resposta de API real, copie o corpo JSON, cole nesta ferramenta, copie a saída TypeScript, cole na sua codebase. Para geração automatizada de endpoints ao vivo, use uma ferramenta do lado do servidor: quicktype (CLI), pacote json-to-ts npm para geração programática, ou ferramentas schema-first como OpenAPI Generator. Para apps TypeScript full-stack, tRPC elimina completamente a viagem de ida e volta.

Como lidar com tipos TypeScript para APIs que mudam ao longo do tempo ou têm esquemas versionados?
Tipos gerados capturam um momento no tempo, mas APIs evoluem — campos são adicionados, descontinuados, renomeados e removidos. Três estratégias para manter os tipos atuais: (1) Regeneração manual em mudanças de esquema — quando uma mudança de API é documentada, execute novamente o gerador com uma resposta nova. (2) Tipos orientados por esquema — se a API fornece esquemas OpenAPI, GraphQL ou Protobuf, gere tipos a partir do esquema; ferramentas como openapi-typescript, graphql-codegen e ts-proto lidam com versionamento. (3) Validação em tempo de execução — pareie tipos estáticos com validadores de esquema em tempo de execução (Zod, Valibot, ArkType) para que incompatibilidades de tipo em tempo de execução se tornem erros explícitos.
O que há de errado em usar any para tipar respostas de API — por que se incomodar com interfaces estritas?
Tipar respostas de API como any é o atalho mais comum e a fonte mais comum de bugs de produção em codebases TypeScript. Com any, o compilador aceita user.adddress (erro de digitação), user.id.toUppercase (id é um número, não uma string) e array[1000].name (pode ser indefinido) — todos travam em tempo de execução, nenhum é capturado em tempo de build. Interfaces estritas convertem esses em erros em tempo de compilação. A compensação é esforço inicial. O retorno escala com o tamanho da equipe e codebase. Prática moderna em 2026: nunca use any para fronteiras de dados externos.
A ferramenta infere uniões de literais de string (enums) e como uso readonly ou as const?
Sim. Ative a opção Uniões de strings (Detectar uniões) e o gerador inspeciona os campos em todos os elementos de um array de objetos; quando os valores de um campo formam um conjunto pequeno e totalmente enumerável de strings distintas, ele emite uma união de literais em vez do tipo string solto — por exemplo role: 'admin' | 'user' em vez de role: string. Essa é exatamente a proteção para a qual o TypeScript estrito existe: com um tipo string puro, um erro como status === 'activ' compila normalmente e chega à produção, enquanto uma união 'active' | 'inactive' o transforma em erro de compilação. O controle Valores distintos máx. (padrão 12, limitado a 2-50) define o corte — campos com mais valores distintos que o limite voltam a string, já que campos de alta cardinalidade como ids ou nomes não são enums reais. A inferência só roda em arrays de objetos, porque um único objeto dá uma amostra e um valor nunca pode ser enumerado. Após gerar, você tem duas formas idiomáticas de apertar mais: adicione o modificador readonly (readonly role: 'admin' | 'user') para que o campo não possa ser reatribuído após a construção, útil para DTOs de resposta de API que devem ser tratados como imutáveis; ou, para um objeto de configuração constante em vez de um tipo, anexe as const ao valor literal (const ROLES = ['admin', 'user'] as const) e derive a união com typeof ROLES[number]. Para segurança em runtime além do tempo de compilação, combine a união com um validador como z.enum(['admin', 'user']) do Zod para capturar valores inesperados na fronteira.
Como a ferramenta lida com JSON muito grande, inteiros grandes e strings de data?
A conversão roda inteiramente no seu navegador em uma única colagem, então o desempenho escala com JSON.parse e a renderização do DOM — respostas de API típicas (dezenas de milhares de linhas) convertem instantaneamente, mas payloads de vários megabytes podem ser lentos porque toda a estrutura é percorrida para inferir tipos; para esses, reduza a um subconjunto representativo ou use um CLI como quicktype. Sobre precisão numérica: JSON tem um único tipo number e o JavaScript faz parse de cada valor numérico como float de 64 bits, então inteiros além de Number.MAX_SAFE_INTEGER (2^53 - 1) perdem precisão silenciosamente antes de a ferramenta vê-los — o tipo gerado é number, mas se sua API retorna ids de 64 bits, o servidor deveria enviá-los como strings e você deveria tipá-los como string, ou usar o tipo bigint com um parser que o preserve. Campos de data e timestamp permanecem tipados como string porque valores ISO-8601 como 2026-05-29T00:00:00Z são strings JSON, não objetos Date; isso é correto para o formato de transporte. Converta para Date na fronteira (new Date(dto.createdAt)) e mantenha o tipo do DTO como string, ou use um branded type / z.string().datetime() do Zod para distinguir strings de data do texto comum sem mentir sobre o que atravessa a rede.
Como este gerador se compara com quicktype, json-to-ts e outras ferramentas JSON-to-TypeScript?
quicktype é a ferramenta open-source mais citada com a análise mais profunda: caminha por múltiplas amostras JSON para inferir campos opcionais, tipos união de respostas diferentes e formas polimórficas complexas. É um CLI com playground web, suporta 20+ linguagens de saída e é a escolha certa para geração de tipos de produção a partir de datasets grandes ou variáveis. json-to-ts é um pacote npm menor focado apenas em saída TypeScript. Ferramentas online como JSON-Type, Transform.tools e esta são convenientes para conversões pontuais sem configuração de CLI. O design desta ferramenta favorece o uso rápido do navegador.
