Sprytne Okazje — promocje, kody rabatowe i wyprzedaże

Generator typów TypeScript z JSON

Wklej obiekt lub tablicę rekordów JSON i dostań interfejsy albo aliasy type z uniami, polami opcjonalnymi i readonly.

Bezpieczne (SSL)
Przetwarzanie Lokalne
100% Darmowe
Instrukcja
  • 1
    Wprowadź dane
    Wpisz treść, wklej tekst lub załaduj plik z dysku.
  • 2
    Kliknij przycisk
    Narzędzie natychmiast przetworzy Twoje dane w przeglądarce.
  • 3
    Pobierz wynik
    Skopiuj gotowy tekst lub zapisz plik na urządzeniu.
function runTool() {
  return "Wynik gotowy w 0.1s";
}
Typy powstają z podanego przykładu. Dane zostają w Twojej przeglądarce i w tym jednym żądaniu.

Interfejsy

2

Pola

7

Pola opcjonalne

0

Typy TypeScript

export interface Root { id: number; name: string; active: boolean; tags: string[]; address: RootAddress; } export interface RootAddress { city: string; zip: string; }
182 znaków · 24 słów · 13 linii

Ściąga: jak JSON zamienia się w typy

Mapowanie wartości JSON na typy TypeScript
W JSONTyp w TypeScriptUwaga
"Anna" string tekst
42 lub 19.99 number TypeScript nie odróżnia liczb całkowitych od ułamków
true / false boolean
null null przy kilku rekordach łączone, np. string | null
[1, 2] number[] typ bierzemy ze wszystkich elementów
["a", 1] (string | number)[] różne typy w tablicy to unia
[] unknown[] pusta tablica nie mówi, co w niej będzie
obiekt zagnieżdżony osobny interfejs nazwa = nazwa rodzica + nazwa pola
tablica obiektów Nazwa[] pola scalane ze wszystkich elementów; brakujące dostają ?

Jak to liczymy

Czytamy przykład i dla każdego pola zapisujemy typ jego wartości. Gdy ta sama pozycja ma w różnych rekordach różne typy, łączymy je w unię. Pole obecne tylko w części rekordów dostaje znak ?. Przykład: {"id":1,"tags":["a"]} daje pola id: number i tags: string[].

interface czy type

Oba zapisy opisują kształt obiektu. Interfejs można później rozszerzać i dopisywać do niego pola w innym miejscu kodu. Alias type jest wszechstronniejszy przy unii typów. Dla odpowiedzi API zwykle wystarczy każdy z nich, wybierz zgodnie z konwencją swojego projektu.

Typowe pułapki

Jeden przykład nie pokazuje wszystkich możliwych wartości. Pole, które w Twoim rekordzie ma tekst, w innym może być null. Daty w JSON to zwykłe teksty, więc dostają typ string. Liczby powyżej 9 007 199 254 740 991 tracą w JavaScript precyzję. Wklej kilka różnych rekordów w tablicy, a pola zostaną scalone.

Oceń to narzędzie:

Powiązane narzędzia

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

Generator typów TypeScript z JSON

Ręczne opisywanie odpowiedzi API jest żmudne i podatne na błędy. Ten generator typów TypeScript zamienia przykładowy JSON – pojedynczy obiekt albo tablicę rekordów – na interfejsy lub aliasy type gotowe do wklejenia do pliku types.ts.

Jak to działa

  • klucze obiektu stają się polami interfejsu, a nazwę głównego typu wpisujesz sam (domyślnie Root),
  • zagnieżdżone obiekty tworzą osobne interfejsy (RootAddress),
  • tablice mapują się na Typ[], a pusta tablica na unknown[],
  • wartości liczbowe → number, logiczne → boolean, tekstowe → string, null → null,
  • gdy ta sama pozycja ma w różnych rekordach różne typy, powstaje unia, np. string | null,
  • pole obecne tylko w części rekordów dostaje znak ?.

Nad wynikiem widać liczbę wygenerowanych typów, pól i pól opcjonalnych, a przycisk kopiuje cały kod. Na start możesz wczytać jeden z czterech przykładów: użytkownik, produkt, lista obiektów albo odpowiedź API.

Przykład

Wejście:

{"id":1,"name":"Anna","tags":["a","b"],"address":{"city":"Warszawa"}}

Wyjście przy domyślnych ustawieniach (interface z export):

export interface Root {
  id: number;
  name: string;
  tags: string[];
  address: RootAddress;
}

export interface RootAddress {
  city: string;
}

Kilka rekordów naraz

Wklej tablicę obiektów, a generator scali ich pola w jeden typ. Przykład „Lista obiektów” z nazwą główną Contact:

[{"id":1,"name":"Anna","phone":null},{"id":2,"name":"Jan","email":"[email protected]","phone":"500100200"}]

export interface Contact {
  id: number;
  name: string;
  phone: string | null;
  email?: string;
}

Pole phone raz jest puste, raz ma tekst, więc dostaje unię string | null. Pole email występuje tylko w drugim rekordzie, więc jest opcjonalne. Liczniki pokażą 1 interfejs, 4 pola i 1 pole opcjonalne. Dla tablicy na najwyższym poziomie powstaje typ jednego elementu, a w kodzie używasz go jako Contact[].

Opcje

OpcjaEfekt
Nazwa głównanazwa typu najwyższego poziomu i przedrostek typów zagnieżdżonych; spacje i polskie znaki są usuwane („profil użytkownika” → ProfilUzytkownika)
Zapis: interfaceexport interface Root { … }
Zapis: typeexport type Root = { … };
exportdodaje słowo kluczowe export (domyślnie włączone)
Wszystkie pola opcjonalnekażde pole z „?”
readonlykażde pole poprzedzone readonly, np. readonly id: number;

Mechanizm wnioskowania typów: od wartości do deklaracji

Generator nie zna z góry schematu API. Dostaje wyłącznie przykładowy JSON – obiekt albo niepustą tablicę obiektów – który najpierw jest parsowany do struktury danych: obiektów, tablic i wartości prostych. Wartość prosta na najwyższym poziomie (np. sama liczba) nie ma pól do opisania, więc narzędzie zgłosi błąd. Na podstawie próbki typy powstają w przejściu rekurencyjnym. Jeśli wartością jest obiekt, generator nie wkleja go w miejscu użycia, tylko tworzy osobny interfejs i wstawia referencję do niego.

Nazewnictwo interfejsów wynika z kontekstu. Obiekt główny otrzymuje nazwę z pola „Nazwa główna” (domyślnie Root). Obiekt w polu address staje się RootAddress, a obiekt w address.geo — RootAddressGeo. W wyniku interfejs rodzica zawsze stoi przed interfejsami zagnieżdżonymi. Gdy dwie ścieżki dają tę samą nazwę, druga dostaje cyfrę: obiekty w polach user_name i userName stają się RootUserName i RootUserName2. Po wygenerowaniu warto zmienić nazwy na takie, które pasują do domeny, na przykład RootAddress na DeliveryAddress.

Przy tablicach generator sprawdza wszystkie wartości w tablicy. Tablica liczb daje number[], tablica tekstów — string[], a tablica mieszana ["a", 1] — (string | number)[]. Tablica obiektów dostaje osobny interfejs elementu z końcówką Item: pole items w obiekcie Root daje RootItemsItem[], a pola wszystkich elementów są scalane. Pusta tablica nie niesie informacji o typie elementu, więc generator wstawia unknown[] – to sygnał, że typ trzeba wpisać ręcznie. Wartości zagnieżdżone głębiej niż 20 poziomów obiektów i tablic też dostają unknown. Generator nie ma wbudowanej listy typów specjalnych: data w stringu pozostanie stringiem, a identyfikator liczbowy — number.

Przykład krok po kroku: głębiej zagnieżdżony profil

  1. Wejściowy JSON: {"userId":7,"profile":{"displayName":"Anna","stats":{"posts":12,"followers":345}},"active":true}
  2. Generator analizuje obiekt główny. Widzi pola userId, profile i active. userId ma wartość 7, więc typ number. active ma true, więc boolean. profile jest obiektem, więc powstanie osobny interfejs.
  3. Dla profile analizuje displayName i stats. displayName to tekst, więc string. stats jest obiektem, więc znów osobny interfejs.
  4. Dla stats odczytuje posts:12 i followers:345. Obie wartości są liczbami, więc oba pola otrzymują typ number.
  5. Wynik: trzy interfejsy i siedem pól. Root zawiera userId: number, profile: RootProfile, active: boolean. RootProfile zawiera displayName: string i stats: RootProfileStats. RootProfileStats zawiera posts: number i followers: number.
  6. Każdy interfejs ma domyślnie export, więc po zmianie nazw fragment można wkleić do pliku types.ts i importować w innych modułach.

Tabela referencyjna: co generator rozpoznaje z kontekstu

Sytuacja w JSONWynikowy typUwagi
Obiekt głównyexport interface RootPunkt startowy deklaracji; nazwę zmienisz w polu „Nazwa główna”.
Obiekt w polu profileRootProfileNazwa interfejsu powstaje z nazwy rodzica i nazwy pola.
Obiekt w profile.statsRootProfileStatsKażdy poziom zagnieżdżenia dostaje osobną deklarację.
Tablica liczb lub tekstównumber[] albo string[]Typ elementu wynika ze wszystkich wartości w tablicy.
Tablica z różnymi typami(string | number)[]Różne typy elementów łączą się w unię.
Tablica obiektów w polu itemsRootItemsItem[]Pola elementów są scalane; brakujące w części elementów dostają „?”.
Pole raz null, raz tekst (kilka rekordów)string | nullUnia powstaje tylko wtedy, gdy oba warianty są w próbce.
Klucz first-name"first-name": stringKlucze, które nie są poprawnymi identyfikatorami, trafiają w cudzysłów.
Liczba całkowita i zmiennoprzecinkowanumberTypeScript nie rozróżnia int i float, więc oba przypadki dają ten sam typ.
Tekst wyglądający jak datastringGenerator nie zamienia go na Date.
Pusta tablicaunknown[]Brak wartości nie pozwala wywnioskować typu elementu; wymaga ręcznej korekty.

Praktyczne wskazówki przed wklejeniem JSON-a

  • Wklejaj kilka realistycznych rekordów — jeśli API zwraca pole tylko w niektórych przypadkach, podaj tablicę z rekordem z tym polem i bez niego, a generator oznaczy je „?”. Kluczy nieobecnych w żadnym rekordzie nie zgadnie.
  • Nadaj nazwy domenowe — wpisz nazwę zasobu w pole „Nazwa główna”, np. OrderResponse, a typy zagnieżdżone dostaną ją jako przedrostek. Resztę popraw ręcznie, np. OrderResponseCustomer na Customer.
  • Ustaw export świadomie — zostaw go, gdy typy mają być importowane w innych plikach projektu.
  • Opcję „Wszystkie pola opcjonalne” stosuj ostrożnie — dodaje „?” do każdego pola, więc rzadko jest zgodna z kontraktem API. Dokładniejszy wynik daje scalenie kilku rekordów.
  • Pola readonly przydają się dla danych, których kod nie modyfikuje, np. odpowiedzi z API trzymanej w stanie aplikacji.
  • Usuń dane wrażliwe — tokeny, adresy e-mail i identyfikatory klientów nie powinny trafiać do narzędzia online. Do typów wystarczą wartości zastępcze tego samego rodzaju.

Czego generator nie uwzględnia

  • Brak schematu API — narzędzie wnioskuje z próbki JSON, a nie z OpenAPI, JSON Schema czy dokumentacji. Nie wykryje pól, których nie ma w przykładzie.
  • Semantyka wartości — data, identyfikator, waluta i UUID pozostaną zwykłym stringiem albo number. Pole status z wartością „paid” da string, nie unię literałów ani enum.
  • Pola, które czasem znikają lub bywają null — jeśli w każdym wklejonym rekordzie pole ma wartość, dostanie typ bez „?” i bez null, nawet gdy API czasem je pomija.
  • Powtarzające się kształty — dwa obiekty o tych samych polach w różnych miejscach dostaną dwa osobne interfejsy. Nazwy oparte na ścieżce bywają też długie (ApiResponseDataItemsItem), więc przy większych odpowiedziach API trzeba je uporządkować ręcznie.

Najczęstsze pytania

Czy wartości null są obsługiwane?

Tak. Samo null daje typ null. Jeśli w innym rekordzie to samo pole ma tekst, generator złączy oba warianty w string | null, dlatego warto wkleić kilka rekordów.

Czy generator obsługuje unie typów?

Tak, gdy ma z czego je wywnioskować: z różnych rekordów w tablicy albo z różnych wartości w jednej tablicy. ["a", 1] daje (string | number)[], a pole liczbowe w jednym rekordzie i tekstowe w drugim – string | number.

Co z kluczami ze znakami specjalnymi?

Zostają ujęte w cudzysłowie, np. "first-name": string;. Interfejs zagnieżdżony dla takiego klucza dostaje nazwę bez znaków specjalnych, np. RootFirstName.

Interface czy type – co wybrać?

Oba zapisy opisują kształt obiektu, a generator daje w nich ten sam zestaw pól. Interfejs można rozszerzać przez extends i uzupełniać kolejną deklaracją o tej samej nazwie; alias type wygodniej łączyć z innymi typami unią lub przecięciem.

Czy wygenerowane typy są zgodne z trybem strict?

Deklaracje są poprawne składniowo, ale w trybie strict trzeba przemyśleć pola opcjonalne, null i unknown[], które wymaga zawężenia typu przed użyciem. Generator nie zna kontraktu API, więc wynik warto zweryfikować.

Czy generator rozpoznaje daty i identyfikatory?

Nie nadaje specjalnych typów: data w JSON to zwykle string, a identyfikator liczbowy to number. Jeśli używasz Date, branded types lub własnych aliasów, popraw wynik ręcznie.

Zainstaluj Webp.pl Miej narzędzia we własnej kieszeni!