Conversor TypeScript para XML
Cola uma interface, type ou objeto tipado TypeScript. Recebe XML limpo.
O que essa ferramenta faz
Se você já precisou escrever na mão um payload XML que espelha uma interface TypeScript — para um cliente SOAP, um gerador de RSS, um arquivo de config ou um teste de contrato — sabe quanta estrutura dá pra montar. O navegador te dá XMLSerializer para um DOM existente, não para um objeto tipado. Cola o TypeScript aqui e recebe XML bem formado de uma passada. Uma interface sozinha, um alias type, um const tipado ou algo bem aninhado — mesmo resultado.
O conversor lê os tipos, não só os valores. interface Order { ... } + const order: Order = { ... } produz uma raiz <Order> com cada campo da interface. Campos opcionais (field?: T) que estão faltando no literal viram elementos vazios para a saída casar com o shape declarado. readonly é ignorado na saída. Os enums emitem o valor (enum de strings emite a string, enum numérico emite o número). Union types emitem o que o literal de fato contém. Generics são resolvidos pela instanciação concreta.
Interfaces aninhadas e arrays se expandem como elementos aninhados. Um campo items: OrderItem[] vira <items><OrderItem/><OrderItem/></items>, usando o nome do tipo do elemento em cada filho. Tipos Record e Map viram containers de <Entry><Key/><Value/></Entry>. Date, bigint e null são tratados por tipo — ISO-8601 para datas, string decimal para bigint, elemento vazio para null. Se colar várias definições de tipo mais uma constante tipada, a constante é o que vai ser serializado e as interfaces servem como schema.
Como usar
Três passos. Funciona do mesmo jeito se você colar uma interface pequena ou um types.ts inteiro.
Cola o TypeScript (ou testa o exemplo)
Joga o TS no editor da esquerda como está. Interface, type alias, const tipado ou módulo inteiro — tudo funciona. Clica em Carregar exemplo para ver um caso realista de Order / OrderItem / Address com objetos aninhados.
Deixa as anotações de tipo — é o que o parser usa para decidir os nomes de elementos e tipos de saída. Deixa também os import e export; são ignorados automaticamente.
Clica em Converter
Aperta o botão verde Converter. A ferramenta lê os tipos, resolve os valores e emite o XML numa passada. Enquanto roda aparece um pequeno indicador de loading.
Copia o XML
O painel da direita enche de XML indentado e bem formado que qualquer parser XML padrão aceita. Cola direto na sua request SOAP, template RSS, arquivo de config ou fixture de teste.
Quando isso salva o dia
Clientes SOAP / APIs XML
Você tem uma interface TypeScript para um body de request SOAP e precisa do esqueleto XML para mandar via <code>fetch</code>. Cola a interface mais um exemplo tipado, copia o XML e cola no seu request.
Contratos baseados em XSD
Gere exemplos XML a partir dos seus types TS para documentação que fica ao lado de um <a href="https://www.w3.org/TR/xmlschema-1/" target="_blank" rel="noopener">XSD</a>. Mantém seus exemplos em sincronia com os types, que estão em sincronia com o schema.
Arquivos de config iniciais
Uma interface Settings com 40 campos vira um template XML pronto pra editar, para qualquer store de config baseado em XML. Sem construir elemento na mão, sem typo, sem campo esquecido.
Mock data para testes de integração
Converte as fixtures tipadas do seu setup Vitest ou Jest em seed XML para sistemas legacy e mock servers que ainda consomem XML.
Perguntas comuns
Usa os types ou só os valores do objeto?
Os dois. Os types decidem nomes de elementos, ordem e quais campos precisam estar presentes (os opcionais viram elementos vazios se faltarem). O literal de valor fornece os dados. Se você colar só um const sem interface, a ferramenta usa o literal direto — ainda funciona, mas sem a segurança dirigida por types.
Como ele lida com campos opcionais e union types?
Campos opcionais (field?: T) que faltam no valor são escritos como elementos vazios (<field/>) para manter o shape de saída consistente. Union types (string | number) emitem o que o literal realmente contém. Discriminated unions também funcionam — o discriminante vira atributo ou elemento filho dependendo do nome.
E Date, bigint e enum?
Valores Date saem como strings ISO-8601. bigint é emitido como string decimal (sem o sufixo n). Enums de string emitem o valor string, enums numéricos emitem o número. null vira elemento vazio, undefined tira o elemento de vez a menos que o campo seja declarado como obrigatório.
Lida com generics, Record e Map?
Sim. Interfaces genéricas são resolvidas pela instanciação concreta — Response<Order> com um valor Order real emite o shape concreto. Record<K, V> vira um container de elementos nomeados, um por chave. Map vira um container de pares <Entry><Key/><Value/></Entry>. Tuplas emitem um elemento por slot.
Posso colar um types.ts inteiro?
Pode. Cola quanto TypeScript quiser. Imports são ignorados, declarações só de tipo definem o shape, e o primeiro const tipado exportado ou top-level é o que vai ser serializado. Se tiver vários candidatos, o que tiver mais campos resolvíveis é escolhido.
Meu código é armazenado?
O código é enviado ao backend pra conversão e não é persistido — a gente não loga o payload. Como em qualquer ferramenta online, se o código for realmente sensível, dá uma olhada antes de colar.
Outras ferramentas que podem ajudar
TypeScript para XML é só uma peça do quebra-cabeça. Estas ferramentas combinam bem com ela: