Vai al contenuto
Type generator

JSON to TypeScript / Go / PHP

Da un payload JSON di esempio, genera type definitions per TypeScript (interface), Go (struct con tag json), PHP (class con typed properties readonly e constructor promotion). Type inference automatica per primitivi, oggetti annidati e array (element type derivato dal primo elemento). Pensato per modellare API response in client tipizzati senza scrivere a mano: incolli il payload reale che ricevi da un'API, scegli il target language e ottieni le definizioni di tipo coerenti.

Come usare il generator

  1. 1

    Incolla il JSON

    Inserisci un payload JSON rappresentativo. Idealmente: la response di un endpoint reale, non un mock-up. Type inference funziona meglio con dati reali (capisce nullability, optional, array element shape).

  2. 2

    Imposta il nome del tipo root

    Default 'Root'. Cambialo nel nome semantico (es. 'UserResponse', 'OrderEvent', 'WebhookPayload'). Il nome viene usato come prefix per i tipi annidati (es. UserAddress, UserOrders).

  3. 3

    Genera i tipi

    Bottone 'Genera': produce 3 output paralleli (TS interface, Go struct, PHP class) tutti basati sulla stessa type inference. I tab in alto switchano la visualizzazione.

  4. 4

    Copia in progetto

    Bottone 'Copia output' per copiare il codice del tab attivo. Da incollare in un file.ts /.go /.php nel tuo progetto. Eventuali aggiustamenti manuali (jsdoc, validation, default values) vanno aggiunti dopo.

Perché un type generator multi-target

Type-first development. API moderne emettono JSON, ma client moderni (TS, Go, PHP 8+) preferiscono tipi statici. Scrivere a mano interfacce per ogni payload è tedioso e error-prone. Un generator automatico prende un sample JSON e produce tipi pronti, riducendo il time-to-first-call da minuti a secondi.

Multi-target rationale. Tre target coprono il 90% dei backend italiani moderni: TypeScript (frontend Vue/React/Angular + Node backend), Go (microservizi cloud-native), PHP 8.x (Laravel/Symfony). Generare tutti e tre da un singolo input è utile in team eterogenei dove la stessa API serve client diversi.

Type inference euristica. Tipi inferiti dal primo valore visto. Limitazioni: array misti (es. [1, "two", true]) tipizzati come union/any/mixed; null come optional; numeri integer-only diventano int/number, float-only diventano float/number; mixed integer+float diventano float. Per casi più complessi (oneOf, discriminated union) serve definire i tipi a mano partendo dall'output generato.

Mapping di tipi per target

string
TS: string. Go: string. PHP: string.
number (integer)
TS: number. Go: int64. PHP: int.
number (float)
TS: number. Go: float64. PHP: float.
boolean
TS: boolean. Go: bool. PHP: bool.
null
Campo marcato come optional/nullable: TS field?: T | null, Go *T con tag omitempty, PHP ?T = null.
array
Element type inferito dal primo elemento. TS: T[]. Go: []T. PHP: array con phpdoc @var T[].
object nested
Genera tipo separato con nome derivato dal field key (PascalCase, prefix col root name). Es. user.address -> tipo UserAddress.
array di object
Element type analizzato come oggetto (merge di shape se elementi multipli). Genera tipo separato.

Glossario

Termini tecnici usati in questa pagina, spiegati in due righe.

Type inference #
Processo automatico di derivazione dei tipi da dati di esempio. Distinto da type checking (verifica statica): qui la inference produce un type definition partendo da un sample concreto.
Discriminated union #
Pattern dove un tipo ha varianti distinte da un campo discriminator (es. {type: "a", a_field:...} vs {type: "b", b_field:...}). Non gestito automaticamente da inference da singolo sample (richiede multi-sample analysis).
Constructor promotion (PHP 8) #
Sintassi PHP 8.0+ che permette di dichiarare e assegnare proprietà nel constructor con visibility inline: public function __construct(public string $name, public int $age). Usata nei tipi PHP generati per ridurre boilerplate.
Struct tag (Go) #
Metadata stringa associato a un field di struct, letto via reflection. json:"field_name" serve a encoding/json per mapping field <-> chiave JSON. Generator emette automaticamente il tag json basato sulla chiave originale.
Readonly properties (PHP 8.1+) #
Modificatore readonly che rende immutable una property dopo l'init nel constructor. Best practice per DTO/value object derivati da JSON immutabile. Generator emette readonly di default.
Optional vs nullable #
TypeScript: field?: T (può mancare) vs field: T | null (presente ma null). Sono distinti. Generator emette field?: T | null quando il sample mostra null (entrambe le possibilita').

Domande frequenti

Posso usare il generator con qualunque JSON?
Si', accetta qualunque JSON valido. Limite pratico ~5MB di input (oltre il browser potrebbe diventare lento). Per array al top-level, il generator inferisce il tipo dell'elemento e produce type Root = ElementType[].
Type inference è deterministica?
Si'. Stesso input JSON produce sempre stesso output. Le scelte sono basate solo sul sample, non su euristiche probabilistiche. Limite: array misti producono union/any/mixed, è la scelta consapevole.
I nomi dei tipi annidati come vengono generati?
PascalCase del field key, prefix col root name. Esempio: root User con field address.street -> tipo UserAddress con field street. Per array di object: orders[0].items -> UserOrdersItems. Eventuali collisioni (due path producono lo stesso nome) NON vengono risolte automaticamente: rinomina manualmente.
Genera sempre tipi valid Go?
Si', i field name vengono PascalCase-d (Go richiede capital per export), tag json mantengono la chiave originale, tipi corrispondono a quelli encoding/json compatibili. Per opzionali Go usa *T + tag omitempty (idiomatic Go).
PHP output usa quale versione?
PHP 8.1+ syntax: typed properties, readonly, constructor promotion. Per supportare PHP 7.4 vai sull'output e cambia public readonly Type $field in private Type $field + getter. PHP 8.0 (no readonly) è un fix banale: rimuovi readonly.
Posso generare anche da YAML?
No, solo JSON. Per YAML converti prima a JSON con il convertitore YAML/JSON/TOML di questo sito, poi incolla il JSON qui.
Genera anche JSON Schema o OpenAPI?
No, lo scope è deliberatamente limitato ai tipi statici di linguaggio. Per JSON Schema o OpenAPI servono tool specializzati che gestiscano i vincoli (required, enum, pattern, format), gli oneOf/anyOf, le references esterne: usa un editor OpenAPI dedicato o un generator multi-target commerciale.

Chi sviluppa questi strumenti?

Maurizio Fonte, consulente IT senior con oltre 20 anni di esperienza in PHP, Laravel, infrastrutture Linux, cybersecurity e integrazione AI/LLM in azienda. Backend di produzione, modernizzazione di codice legacy, audit di sicurezza, agenti AI e MCP server custom: il lavoro che sta dietro a questi strumenti.

Conosci Maurizio Fonte