UTILS.
100% no navegador
📘

JSON Schema para TypeScript

Compile um JSON Schema (draft-07 ou 2020-12) em interfaces e aliases de tipo TypeScript, tratando required, enums, $ref, arrays e combinadores.

saída

Sobre esta ferramenta

A ferramenta JSON Schema para TypeScript compila um documento JSON Schema em interfaces e aliases de tipo TypeScript, fazendo o que a popular biblioteca json-schema-to-typescript faz sem instalar uma toolchain. Diferente dos conversores de JSON de exemplo, este lê um schema real: ele percorre o objeto de schema e transforma type:'object' em uma interface onde as chaves listadas em required são não opcionais e o resto é marcado com ?.

Tudo é analisado e gerado localmente no seu navegador com JSON.parse e JavaScript puro, então seu schema nunca sai da página. Schemas de string com um enum viram uma união de literais de string; string simples, number/integer, boolean e null mapeiam para seus equivalentes TypeScript; arrays viram T[] (uma tupla quando items é um array). Combinadores são suportados — allOf vira uma interseção (A & B) e anyOf / oneOf viram uniões (A | B) — e um tipo nulo type:[T,'null'] vira T | null.

Referências são resolvidas por nome: $ref apontando para #/definitions/X ou #/$defs/X emite uma referência de tipo nomeada, e cada definição é gerada como sua própria export interface ou export type. additionalProperties adiciona uma assinatura de índice [key: string]: T. O nome do tipo raiz recorre ao title ou $id do schema. Alterne saída interface-vs-type e se as strings description do schema viram comentários JSDoc /** */. Copie o resultado ou baixe um arquivo .ts.

Perguntas frequentes

Quais recursos do JSON Schema são suportados?
object com properties e required, enums de string como uniões literais, number/integer/boolean/null, arrays (incluindo tuplas), combinadores allOf/anyOf/oneOf, $ref para definitions ou $defs, additionalProperties como assinatura de índice, e arrays de tipo nulo como ["string","null"].
Como $ref e definitions são tratados?
Um $ref como #/definitions/Address (ou #/$defs/Address) vira uma referência a um tipo nomeado Address, e cada entrada sob definitions ou $defs é emitida como sua própria export interface ou export type, para que as referências resolvam dentro da saída.
O que nomeia o tipo raiz?
A caixa de nome-raiz se você a definir, caso contrário o title do schema, caso contrário o último segmento do seu $id, caso contrário Root. Nomes de definição vêm de sua chave em definitions ou $defs, convertidos para PascalCase.
Posso manter as descrições do schema?
Sim. Com JSDoc ativado (padrão), qualquer string description no schema ou em uma propriedade é emitida como um comentário /** ... */ acima do tipo ou campo correspondente, preservando a documentação no TypeScript gerado.

Mais ferramentas