Skip to content
Powrót do bloga
Poradniki

JSON do TypeScript: generowanie interfejsów i typów (poradnik 2026)

Konwertuj JSON na interfejsy TypeScript poprawnie: reguły wnioskowania typów, interface vs type, pola opcjonalne i unie oraz pułapki, których należy unikać. Za darmo.

11 min czytania

JSON do TypeScript: generowanie interfejsów i typów (poradnik 2026)

Najszybsza droga od JSON do TypeScript to wklejenie payloadu do konwertera JSON na TypeScript i skopiowanie wygenerowanego interface — bez instalacji, bez wysyłania danych, gotowe w przeglądarce. To załatwia przypadek „potrzebuję typów już teraz”.

Ale generowanie typów i generowanie dobrych typów to dwie różne sprawy. Konwerter musi zgadywać: czy to pole jest opcjonalne, czy po prostu brakuje go w jednej próbce? Czy ta array zawsze trzyma string, a może czasem także number? Czy string z datą powinien stać się typem Date? Ten poradnik pokazuje, jak działa wnioskowanie, kiedy sięgnąć po interface, a kiedy po type, oraz jakie pułapki czyhają przy zamianie odpowiedzi z żywego API na typy, którym można zaufać.

Jak skonwertować JSON na TypeScript

Konwersja JSON na TypeScript zajmuje trzy kroki:

  1. Wklej swój JSON. Wrzuć obiekt, tablicę albo surową odpowiedź z API do pola wejściowego. Konwersja uruchamia się natychmiast, w całości po stronie klienta.
  2. Dostrój wynik. Wybierz interface lub type, ustaw nazwę głównego typu, np. User albo ApiResponse, włącz słowo kluczowe export i zdecyduj między ?: a | null dla pól opcjonalnych.
  3. Skopiuj lub pobierz. Pobierz wygenerowany TypeScript jednym kliknięciem i wklej go prosto do swojego kodu.

Tyle w ścieżce transakcyjnej. Konwerter JSON na TypeScript czyta wejście, wnioskuje drzewo typów i wypisuje definicje po prawej stronie — nic nie opuszcza strony. Reszta poradnika dotyczy zrozumienia tego, co konwerter wytworzył, abyś mógł poprawić przypadki, których nie da się zgadnąć.

Jak typy JSON mapują się na TypeScript

Każda wartość JSON ma swój odpowiednik w TypeScript. Mapowanie jest w większości jeden do jednego:

Wartość JSONTyp TypeScript
"text"string
42, 3.14number
true / falseboolean
nullnull
[1, 2, 3]number[]
{ ... }interface lub type

Cała praca dzieje się przy obiektach. Weźmy typowy payload użytkownika z REST:

{
  "id": 101,
  "name": "Ada Lovelace",
  "email": "ada@example.com",
  "active": true,
  "roles": ["admin", "user"]
}

Konwerter wytwarza z tego JSON taki interface TypeScript:

export interface User {
  id: number;
  name: string;
  email: string;
  active: boolean;
  roles: string[];
}

Każdy skalar mapuje się na swój typ prymitywny, a array roles staje się string[]. Wrzuć to do swojego klienta API, a autouzupełnianie i sprawdzanie w czasie kompilacji dostaniesz za darmo.

Jak konwerter wnioskuje typy

Sedno działania konwertera to logika wnioskowania. Cztery reguły pokrywają niemal wszystko, co mu podsuniesz.

Wnioskowanie strukturalne: jeden nazwany interface na obiekt

Każdy odrębny kształt obiektu staje się własnym nazwanym interface. Zagnieżdżone obiekty nie zwijają się do typów inline — zostają wyniesione do osobnych, referencjonowanych definicji:

{
  "order": {
    "id": "A-1",
    "total": 42.5,
    "customer": { "name": "Sam", "vip": false }
  }
}
export interface Root {
  order: Order;
}

export interface Order {
  id: string;
  total: number;
  customer: Customer;
}

export interface Customer {
  name: string;
  vip: boolean;
}

Identyczne kształty są deduplikowane, więc dwa pola o tej samej strukturze współdzielą jeden interface, zamiast tworzyć kopie.

Scalanie tablic: wnioskowanie pól opcjonalnych

Kiedy podasz tablicę obiektów, konwerter scala je klucz po kluczu. Jeśli jakiś klucz pojawia się w niektórych elementach, a w innych nie, zostaje oznaczony jako opcjonalny:

{
  "users": [
    { "id": 1, "nick": "x" },
    { "id": 2 }
  ]
}
export interface Root {
  users: User[];
}

export interface User {
  id: number;
  nick?: string;
}

id jest w każdym elemencie, więc pozostaje wymagane. nick brakuje u drugiego użytkownika, dlatego staje się nick?: string. Właśnie dlatego pojedyncza próbka rzadko wystarcza — zobacz sekcję o pułapkach poniżej.

Typy unii dla mieszanych tablic

Tablice nie muszą być jednorodne. Gdy elementy mają różne typy, konwerter zbiera je w unię:

{
  "tags": ["a", "b"],
  "meta": [1, "two"]
}
export interface Root {
  tags: string[];
  meta: (string | number)[];
}

tags to jednolicie string, więc string[]. meta miesza number i string, dając (string | number)[]. Pustej tablicy nie da się wywnioskować w ogóle i jest sprowadzana do unknown[] — uczciwie, bo z zera elementów niczego się nie nauczysz.

Opcjonalne vs null: ?: kontra | null

Wyglądają podobnie, ale znaczą co innego. Pole oznaczone ?: może być w obiekcie nieobecne. Pole otypowane | null jest zawsze obecne, ale może trzymać wartość null:

{ "score": null }
export interface Root {
  score: number | null;
}

Tutaj score jest obecne z jawnym null, więc otypowane jest jako number | null — wartość istnieje, jest po prostu null. Porównaj to z nick?: string z przykładu z tablicą, gdzie klucza może w ogóle brakować. Sięgaj po ?:, gdy API może pominąć klucz, a po | null, gdy wysyła klucz z wartością null. Większość konwerterów pozwala sterować tym renderowaniem za pomocą przełącznika.

interface vs type: którego użyć?

Oba potrafią opisać kształt obiektu. Oto jak zdecydować:

PotrzebaUżyj
Zwykły kształt obiektu z JSONinterface
Unia (A | B) lub przecięcie (A & C)type
Scalanie deklaracji / rozszerzanie między plikamiinterface
Typy mapowane lub warunkowetype
Nieco czytelniejsze komunikaty błędów w edytorzeinterface

Dla danych pochodzących z obiektu JSON interface to wybór konwencjonalny i daje odrobinę przyjemniejsze błędy kompilatora. W chwili, gdy potrzebujesz unii — powiedzmy Result, który jest albo sukcesem, albo błędem — musisz przejść na type, bo interface nie potrafią wyrazić unii:

type ApiResult =
  | { status: "ok"; data: User }
  | { status: "error"; message: string };

Dobry domyślny wybór: generuj interface dla zwykłych obiektów JSON, a przejdź na type, gdy kształt wymaga unii lub przecięcia. TypeScript Handbook omawia przypadki brzegowe, jeśli chcesz pełne porównanie. Gdy zamiast interface potrzebujesz aliasu json to typescript type, większość konwerterów udostępnia pojedynczy przełącznik, który przerzuca cały wynik.

quicktype vs json-to-ts vs narzędzia online vs ręcznie

Nie ma jednej najlepszej metody generowania typów TypeScript — zależy to od tego, gdzie żyje JSON i jak często się zmienia.

PodejścieNajlepsze doKompromis
quicktypeWyjście wielojęzyczne, generowanie kodu walidacji w czasie wykonaniaCięższe; więcej wyniku, niż często potrzebujesz
json-to-ts (biblioteka)Generowanie kodu w czasie budowania, wpięte w skrypt lub pipelineWymaga konfiguracji i toolchainu Node
Narzędzie online w przeglądarceKonwersje jednorazowe, wrażliwe payloady, zero instalacjiRęczne wklejanie za każdym razem
Pisanie typów ręcznieDrobne obiekty, nauka systemu typówŻmudne i podatne na błędy przy skali

Wybierz quicktype, gdy potrzebujesz typów w kilku językach albo chcesz, by wyemitował walidatory obok typów. Wybierz bibliotekę json-to-ts, gdy konwersja należy do kroku budowania. Do szybkiej konwersji — zwłaszcza payloadu zawierającego token, identyfikatory klientów czy cokolwiek, czego wolisz nie wklejać do zdalnej usługi — narzędzie przeglądarkowe wygrywa prywatnością i szybkością. Nasz konwerter JSON na TypeScript działa w całości po stronie klienta: JSON nigdy nie opuszcza strony i nie ma nic do instalowania ani aktualizowania.

Typy to nie walidacja: pomost do sprawdzeń w czasie wykonania

To zaskakuje wiele zespołów, więc warto powiedzieć wprost: typy TypeScript są usuwane w czasie kompilacji i nie robią nic w czasie wykonania. Wygenerowany interface User nie sprawdzi, czy faktyczna odpowiedź z API do niego pasuje. Jeśli serwer wyśle id jako string zamiast number, TypeScript bez mrugnięcia uwierzy twojej adnotacji typu, podczas gdy prawdziwe dane kłamią.

Aby generate typescript types i wymuszać je na żywych danych, połącz typy z walidatorem działającym w czasie wykonania:

  • zod — zdefiniuj schema raz, wywnioskuj z niego typ statyczny i parsuj odpowiedzi w czasie wykonania.
  • io-ts — walidacja oparta na kodekach, popularna w kodzie funkcyjnym.
  • JSON Schema + Ajv — schematy niezależne od języka, walidowane w czasie wykonania, przydatne, gdy kontrakt jest współdzielony między usługami.

Częsty wzorzec to wygenerowanie interface dla wsparcia w edytorze, a następnie napisanie pasującej schema zod jako faktycznego sprawdzenia na granicy:

import { z } from "zod";

const UserSchema = z.object({
  id: z.number(),
  name: z.string(),
  email: z.string().email(),
  active: z.boolean(),
  roles: z.array(z.string()),
});

type User = z.infer<typeof UserSchema>;

// Throws if the real response doesn't match the schema.
const user = UserSchema.parse(await res.json());

Jeśli idziesz drogą schematu, nasz poradnik walidacji JSON Schema prowadzi przez pisanie i wymuszanie schematów od początku do końca.

Częste pułapki przy typowaniu JSON

Wygenerowane typy to punkt wyjścia, a nie gotowy produkt. Uważaj na te rzeczy.

snake_case vs camelCase. Konwertery zachowują klucze dosłownie. Payload w stylu GitHuba z public_repos produkuje public_repos: number, a nie publicRepos. Jeśli twój kod preferuje camelCase, albo pogodzisz się z typami w snake_case, albo dodasz warstwę mapowania, która zmienia nazwy pól na wejściu.

Stringi z datami pozostają string. Pole takie jak "2026-06-01T00:00:00Z" jest otypowane jako string, nie Date. To celowe — JSON nie ma typu daty, a błędne zgadnięcie jest gorsze niż uczciwość. Konwersja string-do-Date należy do twojej warstwy parsowania, gdzie masz nad nią kontrolę.

Wyciek any i unknown. Puste tablice stają się unknown[], a głęboko mieszane struktury mogą degradować się do luźnych typów. To nie są błędy; to konwerter przyznający, że nie potrafi wnioskować z niewystarczających danych. Dociśnij je ręcznie, gdy poznasz prawdziwy kształt.

Eksplozja głębokiego zagnieżdżenia. Mocno zagnieżdżony payload generuje długi łańcuch małych interface. Zwykle jest to w porządku i czytelniejsze niż jeden gigantyczny typ inline, ale warto spłaszczyć kształty, które nie zasługują na własną nazwę.

Pułapka pojedynczej próbki. Ta liczy się najbardziej. Pola opcjonalne da się wywnioskować tylko z wielu elementów tablicy; pojedynczy obiekt nie powie konwerterowi, których kluczy czasem brakuje. Zbierz najpierw reprezentatywną tablicę odpowiedzi. Formatowanie JSON przydaje się do wklejania i oglądania kilku próbek obok siebie przed konwersją, a jeśli podajesz niestandardowe wejście, takie jak JSONC, przeczytaj nasz poradnik JSON5 / JSONC — konwerter potrzebuje ściśle poprawnego JSON.

Najczęściej zadawane pytania

Jak skonwertować JSON na interface TypeScript?

Wklej swój JSON do konwertera JSON na TypeScript. Czyta on wejście w przeglądarce i natychmiast generuje interface TypeScript. Kliknij Kopiuj, by pobrać wynik — bez wysyłania danych, bez konta, bez wtyczki do instalacji.

Czy dla danych JSON użyć interface, czy type?

Dla zwykłych kształtów obiektów z JSON używaj interface — to konwencjonalne i daje nieco czytelniejsze błędy w edytorze. Przejdź na type, gdy potrzebujesz unii lub przecięcia, bo interface nie potrafią ich wyrazić.

Jak obsługiwane są zagnieżdżone obiekty i tablice?

Zagnieżdżone obiekty stają się osobnymi, nazwanymi interface (pole address daje interface Address). Tablice obiektów są scalane klucz po kluczu w jeden interface elementu; tablice prymitywów stają się otypowanymi tablicami, np. string[].

Jak typowane są pola opcjonalne i null?

Klucz, którego brakuje w niektórych elementach tablicy, jest oznaczany jako opcjonalny (nick?: string). Klucz, który jest zawsze obecny, ale trzyma null, jest typowany z | null (score: number | null). Te dwa opisują różne sytuacje: nieobecny kontra obecny-ale-null.

Czy typy TypeScript walidują JSON w czasie wykonania?

Nie. Typy TypeScript są usuwane w czasie kompilacji i nie sprawdzają danych w czasie wykonania. Aby zwalidować faktyczną odpowiedź z API, połącz wygenerowane typy z walidatorem działającym w czasie wykonania, takim jak zod, io-ts albo JSON Schema z Ajv.

quicktype vs json-to-ts vs konwerter online — który jest najlepszy?

quicktype pasuje do wyjścia wielojęzycznego i walidatorów czasu wykonania; biblioteka json-to-ts pasuje do generowania kodu w czasie budowania; konwerter online pasuje do szybkich, prywatnych, jednorazowych konwersji bez instalacji. Dla wrażliwych payloadów narzędzie przeglądarkowe działające po stronie klienta trzyma dane z dala od jakiegokolwiek serwera.

Dlaczego stringi z datami są typowane jako string, a nie Date?

JSON nie ma typu daty, więc data jest po prostu stringiem na łączu. Otypowanie jej jako string jest uczciwe i stabilne; konwersja na Date to decyzja dla twojej warstwy parsowania, gdzie masz kontrolę nad formatem i obsługą błędów.

Czy moje dane JSON są prywatne przy użyciu konwertera online?

Z narzędziem działającym po stronie klienta — tak. Konwersja przebiega w całości w przeglądarce za pomocą JavaScript, więc JSON — w tym token, identyfikatory i dane klientów — nigdy nie opuszcza strony i nigdy nie jest wysyłany na serwer.

Powiązane artykuły

Zobacz wszystkie artykuły