Membangkitkan Tipe TypeScript dari JSON: Panduan Praktis
Menulis interface TypeScript secara manual untuk respons API 40 field itu melelahkan dan rawan salah — salah ketik pada nama field diam-diam merusak type safety alih-alih memunculkan compile error. Membangkitkan interface langsung dari sampel JSON nyata lebih cepat dan lebih akurat, selama Anda memahami di mana inferensi harus menebak.
Cara kerja inferensi JSON-ke-TypeScript
Generator menelusuri pohon nilai JSON dan memetakan setiap tipe JavaScript ke padanan TypeScript-nya: string tetap string, number tetap number, boolean tetap boolean, null menjadi null (atau digabungkan ke union), array menjadi T[] dengan T diinferensi dari elemennya, dan object menjadi interface bersarang.
{
"id": 42,
"email": "ada@example.com",
"isActive": true,
"roles": ["admin", "editor"],
"profile": {
"displayName": "Ada",
"avatarUrl": null
}
}interface Root {
id: number;
email: string;
isActive: boolean;
roles: string[];
profile: {
displayName: string;
avatarUrl: string | null;
};
}Di mana inferensi harus menebak
Field opsional vs. selalu hadir: satu sampel JSON tak bisa memberi tahu generator apakah avatarUrl kadang hilang sepenuhnya (yang seharusnya avatarUrl?: string | null) atau selalu hadir tetapi kadang null. Beri generator beberapa sampel representatif, atau tandai field sebagai opsional secara manual setelah pembangkitan jika Anda tahu API menghilangkannya dalam kondisi tertentu.
Angka yang sebenarnya ID vs. kuantitas: JSON punya satu tipe number, tetapi TypeScript tak bisa membedakan ID integer dari harga floating-point tanpa konteks tambahan. Sebagian generator menawarkan branded types atau literal union untuk ini; kebanyakan sekadar menghasilkan number dan menyerahkan perbedaannya pada Anda.
Array kosong: array tanpa contoh di dalamnya ("tags": []) tidak memberi generator apa pun untuk menginferensi tipe elemennya — biasanya ia jatuh ke unknown[] atau any[]. Arahkan generator ke sampel yang array-nya terisi, atau anotasikan manual setelahnya.
Literal union string: field status yang selalu salah satu dari "pending" | "active" | "closed" akan diinferensi sebagai string polos kecuali generator melihat semua nilai yang mungkin dalam sampel — dan bahkan saat itu, kebanyakan generator memilih tipe string yang lebih luas kecuali Anda mengaktifkan inferensi literal-union secara eksplisit.
Tanggal: JSON tak punya tipe tanggal — timestamp selalu berupa string (ISO 8601) atau angka (Unix epoch). Generator akan mengetikkan field tanggal sebagai string atau number, bukan Date; Anda tetap perlu mem-parsenya sendiri setelah fetching.
Ide yang sama dalam bahasa lain
Logika inferensinya — telusuri pohonnya, petakan tipenya, beri nama object bersarang — sama saja apa pun bahasa targetnya; hanya sintaks keluarannya yang berubah. Struct Go mendapat pemetaan field yang sama dengan struct tag untuk nama key JSON; dataclass Python mendapat type hint dan pembungkus Optional[...] opsional; kelas Java atau C# mendapat field bertipe dan getter/setter atau records. Jika tim Anda bekerja lintas bahasa terhadap API yang sama, membangkitkan tipe untuk masing-masing dari sampel JSON yang sama menjaga mereka tetap jujur satu sama lain.
type Root struct {
ID int `json:"id"`
Email string `json:"email"`
IsActive bool `json:"isActive"`
Roles []string `json:"roles"`
Profile struct {
DisplayName string `json:"displayName"`
AvatarURL *string `json:"avatarUrl"`
} `json:"profile"`
}Sebelum memercayai tipe yang dibangkitkan
Tipe yang dibangkitkan adalah titik awal yang kuat, bukan kontrak final. Sebelum meng-commit: konfirmasikan field opsional terhadap dokumentasi API nyata (bukan satu sampel saja), ganti field string yang longgar namun sebenarnya enum dengan literal union, pastikan field array-kosong mendapat tipe elemen nyata dari sampel yang lebih baik, dan bangkitkan ulang setiap kali API upstream menambah atau mengganti nama field alih-alih menambal interface-nya secara manual.
FAQ
- Bisakah generator JSON-ke-TypeScript menangani field yang kadang string dan kadang number?
- Bisa, jika ia melihat kedua varian dalam sampel-sampel yang diberikan — seharusnya ia menginferensi string | number. Dengan hanya satu sampel, ia hanya bisa mengetikkan apa yang dilihatnya. Inilah alasan utama membangkitkan dari beberapa payload representatif alih-alih satu contoh happy-path.
- Haruskah interface hasil pembangkitan memakai `interface` atau `type`?
- Secara fungsional nyaris identik untuk kasus ini. `interface` lebih umum untuk bentuk object dan mendukung declaration merging; `type` lebih fleksibel untuk union dan intersection. Keduanya cocok untuk bentuk respons API — pilih yang sesuai konvensi kode basis Anda yang sudah ada.
- Bagaimana menjaga tipe hasil pembangkitan tetap sinkron seiring API berevolusi?
- Perlakukan pembangkitan sebagai langkah yang dapat diulang, bukan copy-paste sekali jadi: simpan sampel respons nyata di repositori (atau ambil dari endpoint staging) dan bangkitkan ulang interface setiap kali sampelnya berubah, alih-alih mengedit manual berkas hasilnya. Sebagian tim mengaitkannya ke CI untuk menangkap drift secara otomatis.
- Apakah ini bekerja untuk JSON yang bersarang dalam atau rekursif, seperti struktur pohon?
- Nesting yang dalam membangkitkan interface bersarang dengan baik. Struktur yang benar-benar rekursif (komentar yang bisa berisi balasan dengan bentuk yang sama) membutuhkan tipe self-referential, yang tidak akan diinferensi otomatis oleh kebanyakan generator dari satu sampel — biasanya Anda perlu menulis interface rekursifnya sekali secara manual lalu menggunakannya ulang.
Coba alat ini
JSON to TypeScript →
Generate TypeScript interfaces from JSON with optional readonly modifiers and JSDoc comments.
JSON to Go →
Generate Go structs with json tags from a JSON sample, ready for encoding/json.
JSON to Python →
Generate Python TypedDict classes from a JSON sample for mypy, Pyright, and editor autocompletion.
Artikel terkait
Apa itu JSON? Panduan Lengkap untuk Pemula →
JSON (JavaScript Object Notation) adalah format pertukaran data yang ringan, mudah dibaca manusia dan mudah diurai mesin. Pelajari sintaks, tipe data, dan struktur yang menjadi fondasi API modern.
Sejarah JSON: Dari Tahun 2000 hingga Menjadi Standar Industri →
Telusuri JSON dari ide Douglas Crockford tahun 2001, diadopsi oleh Yahoo, hingga menjadi standar ECMA-404 yang menggerakkan 90% API modern.
Panduan Lengkap JSON Schema (Draft 7) →
JSON Schema adalah standar untuk mendeskripsikan dan memvalidasi struktur JSON. Pelajari keyword inti, bangun schema API nyata, dan terapkan praktik terbaik.