Wklej TypeScript po lewej i kliknij "Konwertuj" — zrobimy z tego XMLWklej kod TypeScript

Co robi to narzędzie

Jeśli kiedyś musiałeś ręcznie napisać XML-owego payloada, który odzwierciedla interface w TypeScripcie — pod klienta SOAP, generator RSS, plik konfiguracyjny albo contract test — to wiesz, ile rusztowania trzeba do tego postawić. Przeglądarka daje ci XMLSerializer pod istniejący DOM, a nie pod typowany obiekt. Wklej TypeScripta tutaj i dostaniesz poprawnie uformowany XML za jednym zamachem. Pojedyncze interface, alias type, typowany const albo coś głęboko zagnieżdżonego — wynik ten sam.

Konwerter czyta typy, nie tylko wartości. interface Order { ... } + const order: Order = { ... } daje root <Order> z każdym polem z interfejsu. Optional fields (field?: T), których nie ma w literale, stają się pustymi elementami, żeby output trzymał się zadeklarowanego shape'u. readonly dla outputu jest ignorowane. Enumy emitują swoją wartość (string enumy stringa, numeryczne liczbę). Typy union emitują to, co faktycznie siedzi w literale. Generics są rozwiązywane przez konkretną instancjację.

Zagnieżdżone interfejsy i tablice rozwijają się jako zagnieżdżone elementy. Pole items: OrderItem[] staje się <items><OrderItem/><OrderItem/></items>, z nazwą typu elementu dla każdego dziecka. Typy Record i Map stają się kontenerami <Entry><Key/><Value/></Entry>. Date, bigint i null są traktowane per typ — ISO-8601 dla dat, stringa dziesiętnego dla bigint, pustego elementu dla null. Jeśli wkleisz kilka definicji typów plus jedną typowaną stałą, to ta stała jest serializowana, a interfaces robią za schemat.

Jak z tego korzystać

Trzy kroki. Działa tak samo, czy wklejasz krótkiego interface'a, czy całe types.ts.

1

Wklej swój TypeScript (albo spróbuj przykładu)

Wrzuć TS do edytora po lewej tak, jak jest. Interface, type alias, typowany const albo cały moduł — wszystko przejdzie. Kliknij Załaduj przykład, żeby zobaczyć realistyczny przypadek Order / OrderItem / Address z zagnieżdżonymi obiektami.

Zostaw adnotacje typów — to na ich podstawie parser decyduje o nazwach elementów i typach wyjściowych. Zostaw też import-y i export-y, są ignorowane automatycznie.

2

Kliknij Konwertuj

Kliknij zielony przycisk Konwertuj. Narzędzie czyta typy, rozwiązuje wartości i emituje XML w jednym przebiegu. Podczas pracy pojawia się na chwilę wskaźnik ładowania.

3

Skopiuj XML

Prawy panel wypełnia się wciętym, poprawnie uformowanym XML-em, który przyjmie każdy parser XML zgodny ze standardem. Wrzuć go prosto do requesta SOAP, szablonu RSS, pliku konfiguracyjnego albo fixture'a testowego.

Kiedy to naprawdę ratuje życie

Klienci SOAP / API XML

Masz interface w TypeScripcie pod body requesta SOAP i potrzebujesz szkieletu XML, żeby wysłać go przez <code>fetch</code>. Wklej interface plus typowany przykład, skopiuj XML, wrzuć w requesta.

Kontrakty oparte na XSD

Generuj przykłady XML ze swoich typów TS do dokumentacji, która stoi obok <a href="https://www.w3.org/TR/xmlschema-1/" target="_blank" rel="noopener">XSD</a>. Trzyma twoje przykłady zsynchronizowane z typami, a typy ze schematem.

Startowe pliki konfiguracyjne

Interface Settings z 40 polami zamienia się w gotowy do edycji szablon XML dla dowolnego configu opartego o XML. Bez ręcznego budowania elementów, bez literówek, bez zapomnianych pól.

Mockowe dane do testów integracyjnych

Zamień typowane fixture'y z setupu Vitesta albo Jesta w seedowe dane XML pod legacy systemy i mock serwery, które dalej konsumują XML.

Częste pytania

Używa typów czy tylko wartości obiektu?

Obu. Typy decydują o nazwach elementów, kolejności i o tym, które pola muszą być obecne (optional-e stają się pustymi elementami, jeśli brakuje ich w wartości). Literał z wartością dostarcza danych. Jeśli wkleisz tylko const bez interface'a, narzędzie użyje literału bezpośrednio — dalej działa, po prostu bez tej siatki bezpieczeństwa ze strony typów.

Jak radzi sobie z polami optional i typami union?

Brakujące pola optional (field?: T) są zapisywane jako puste elementy (<field/>), żeby shape outputu był spójny. Typy union (string | number) emitują to, co literał faktycznie zawiera. Discriminated unions też działają — dyskryminator ląduje jako atrybut albo element-dziecko zależnie od nazwy.

A co z Date, bigint i enum?

Wartości Date wychodzą jako stringi ISO-8601. bigint jest emitowany jako string dziesiętny (bez sufiksu n). String enumy emitują wartość stringową, numeryczne emitują liczbę. null staje się pustym elementem, undefined kasuje element w ogóle, chyba że pole jest zadeklarowane jako wymagane.

Obsługuje generics, Record i Map?

Tak. Generyczne interfejsy są rozwiązywane przez konkretną instancjację — Response<Order> z prawdziwą wartością Order emituje konkretny shape. Record<K, V> zamienia się w kontener nazwanych elementów, po jednym na klucz. Map zamienia się w kontener par <Entry><Key/><Value/></Entry>. Typy krotki emitują jeden element na slot.

Mogę wkleić cały plik types.ts?

Tak. Wklej tyle TypeScripta, ile chcesz. Importy są ignorowane, deklaracje tylko-typowe definiują shape, a pierwszy eksportowany albo top-level typowany const jest tym, co zostanie zserializowane. Jeśli kandydatów jest kilku, wygrywa ten z największą liczbą rozwiązalnych pól.

Czy mój kod jest gdzieś zapisywany?

Kod leci na backend po to, żeby zostać skonwertowany, i nigdzie nie jest trwały — nie logujemy payloadu. Jak zawsze w online'owych narzędziach: jeśli kod jest naprawdę wrażliwy, zerknij na niego przed wklejeniem.

Inne narzędzia, które mogą się przydać

TypeScript do XML to tylko jeden element układanki. Te narzędzia dobrze się z nim komponują: