Aus einem JSON-Sample fertige TypeScript-Typen machen
Du hast eine JSON-Response von einer API und brauchst einen TypeScript-Typ dafuer. Jetzt. Ohne jedes Feld von Hand zu tippen, ohne ein verschachteltes Objekt drei Ebenen tief zu vergessen, ohne zu uebersehen, dass das Feld manchmal `null` ist. JSON links pasten, sauberes `interface` rechts bekommen.
Der Generator erkennt verschachtelte Objekte und gibt jedem einen eigenen Typ-Namen. Er laeuft durch Arrays, sucht den Element-Typ und gibt `User[]` statt einer langen Inline-Shape. Sind Keys mal fehlend oder mal null, fuegt er ein `?` dran. Enthaelt dein Array Objekte mit leicht verschiedenen Feldern, mergt er sie zu einer Super-Shape und markiert die Unterschiede als optional.
Vier Output-Formate: ein TypeScript-`interface`, ein TypeScript-`type`-Alias, ein Zod-Runtime-Schema (mit `z.infer` fuer den statischen Typ), oder ein JSON-Schema-Dokument (fuer OpenAPI, AJV, Contract-Tests). Alles im Browser, nichts verlaesst die Maschine.
So nutzt du das Tool
- JSON pasten im linken Panel. Das Default-Sample ist eine typische API-Order-Response, damit du den Generator sofort siehst.
- Output-Format waehlen: interface (Alltag), type-Alias (fuer Unions oder Mapped Types), Zod (wenn du auch Runtime-Validierung brauchst) oder JSON Schema (fuer OpenAPI und Contract-Tests).
- Root-Typ-Namen setzen (Default `Root`). Gute Namen: `User`, `Order`, `ApiResponse`. Der Generator nutzt deinen Namen oben und leitet Child-Namen aus den Keys ab (`customer` -> `Customer`).
- `unknown` statt `any` fuer sicherere Typen: leere Arrays werden `unknown[]` statt `any[]`, das Typsystem zwingt dich zum Narrowing vor der Nutzung.
- Optional basierend auf null wenn deine API manchmal `"phone": null` schickt: der Generator macht `phone?: string` statt `phone: string | null`. Aus, wenn du explizites null im Typ willst.
- Keys zu camelCase wenn dein JSON snake_case nutzt (`created_at`) und dein TS-Code camelCase (`createdAt`). Der Original-Key bleibt im Kommentar.
- Aehnliche Shapes mergen wenn ein Array Objekte mit leicht anderen Feldern enthaelt. Aus: verbose Union. An: eine saubere Shape mit `?`-Markern auf den Unterschieden.
- Klick `Kopieren` fuers Clipboard oder `Runterladen` als `.ts`-Datei (oder `.json` fuer JSON Schema). In dein Projekt pasten, fertig.
Wann das nuetzlich ist
Fuenf Situationen, in denen das 10 Minuten Tipparbeit spart:
- Neuen API-Endpoint anschliessen. Du hittest `/api/orders` und kriegst eine fette JSON-Response. Hier pasten, in drei Sekunden `Order`, `Customer`, `Item` Interfaces. In `types.ts` kippen, dein Code autocomplettet jedes Feld korrekt.
- Untypisiertes JavaScript zu TypeScript migrieren. Alter Code liest JSON und ratet die Shape. Ein Beispiel hier pasten, Typen kriegen, oben in die Datei, der Compiler findet jede Stelle, die ein fehlendes oder falsches Feld anfasst.
- Zod-Schema fuer ein Formular bauen. Du kennst die Shape (aus einem JSON-Sample), brauchst Runtime-Validierung. Switch zu Zod, kriegst `z.object({...})` mit den richtigen Primitive-Validatoren, in deine Form-Library (React Hook Form, Formik, TanStack Form) packen.
- OpenAPI-Spec aus echter Response schreiben. Das Backend gibt schon JSON, du musst es in OpenAPI beschreiben. Switch zu JSON Schema, kriegst Draft-2020-12-Dokument mit `$defs`, in die Response-Section deines Endpoints. Fertig.
- Contract mit Frontend-Team teilen. Du hast einen JSON-Payload, musst der anderen Seite sagen, was zu erwarten ist. Interface generieren, in Slack oder Doc, beide Teams haben die gleiche Wahrheit.
Mit echter Spec arbeiten? Nimm OpenAPI zu TypeScript fuer volle Request/Response-Typen oder GraphQL zu TypeScript fuer SDL.