JSON ke TypeScript

Tempel sebuah sampel JSON, dan alat ini akan menyimpulkan antarmuka TypeScript yang sesuai dengan strukturnya. Tipe bidang ditentukan berdasarkan nilai yang teramati (string, number, boolean, Array<T>); objek bersarang memperoleh antarmuka bernama sendiri; sedangkan bidang yang teramati sebagai null atau hilang menjadi opsional (?) atau dapat bernilai null (| null), tergantung gaya yang Anda pilih.

Cara mengonversi JSON ke TypeScript

  1. 1

    Tempel JSON

    Satu sampel sudah cukup, tetapi beberapa sampel meningkatkan penyimpulan kemungkinan null dan tipe union.

  2. 2

    Pilih gaya keluaran

    `interface` (bawaan), alias `type`, atau antarmuka hanya-baca dengan semua bidang ditandai sebagai `readonly`.

  3. 3

    Pilih strategi opsional

    Tandai bidang sebagai `?` (bisa tidak ada) atau `| null` (selalu ada, tetapi bisa bernilai null).

  4. 4

    Salin tipenya

    Tempel ke dalam berkas `.ts`, dan Anda memperoleh akses bertipe kuat ke respons API.

Contoh

Masukan:

{ "id": 1, "name": "Alice", "age": null, "tags": ["admin", "user"], "address": { "city": "Madrid" } }

Keluaran:

interface User {
  id: number;
  name: string;
  age: number | null;
  tags: string[];
  address: Address;
}

interface Address {
  city: string;
}

Pemetaan tipe

JSON TypeScript
string string
bilangan bulat / desimal number
boolean boolean
hanya null null
null + T T | null (atau T?)
array dari T T[]
array campuran (T1 | T2)[]
objek Antarmuka bersarang bernama
array kosong unknown[] (tidak dapat disimpulkan)

Bidang opsional vs bidang yang dapat bernilai null

  • foo?: string, bidang ini bisa tidak ada pada objek. Pemeriksaan undefined berlaku.
  • foo: string | null, bidang ini selalu ada, tetapi bisa secara eksplisit bernilai null.
  • foo?: string | null, bisa tidak ada ATAU bernilai null.

JSON sendiri tidak memiliki undefined, tetapi setiap API menandakan ketiadaan bidang dengan cara berbeda. Sesuaikan dengan semantik API yang Anda gunakan.

  • API REST biasanya menghilangkan bidang yang hilang -> ?:.
  • GraphQL selalu mengembalikan setiap bidang yang diminta -> | null.
  • Beberapa SDK menggunakan keduanya dalam konteks yang berbeda.

Tipe union vs tipe literal

Jika alat melihat bidang string yang sama hanya mengambil sekumpulan kecil nilai di seluruh sampel ("status": "pending", "active", "archived"), alat dapat menghasilkan union literal string:

status: "pending" | "active" | "archived";

Aktifkan “simpulkan union literal string” jika Anda menginginkannya.

Kesalahan umum

  • Menyimpulkan dari satu sampel. Setiap bidang menjadi wajib; kemungkinan null tidak dapat diamati. Untuk tipe yang lebih baik, berikan 5-10 sampel yang bervariasi.
  • Array kosong. "tags": [] tidak memberikan informasi tipe, generator menghasilkan unknown[]. Berikan sampel dengan setidaknya satu elemen.
  • Array bertipe campuran. [1, "two", true] menghasilkan (number | string | boolean)[]. Biasanya ini berarti JSON sebaiknya dirancang ulang alih-alih diberi tipe apa adanya.
  • Kunci string numerik. JSON {"1": "a", "2": "b"} tetap berupa objek di TypeScript (Record<string, string>), bukan array. Generator menangani hal ini dengan benar.

Pertanyaan yang Sering Diajukan

Sesuaikan dengan API Anda. API REST yang membuang bidang null cocok dengan ?:. GraphQL, yang selalu mengembalikan setiap bidang yang dipilih, cocok dengan | null. Saat ragu, T | null dengan sintaks wajib lebih ketat dan menangkap lebih banyak bug saat kompilasi.

Ya, jika Anda mengaktifkannya dan menyediakan beberapa sampel. Bidang yang teramati memiliki 2-5 nilai string berbeda di seluruh sampel akan dikeluarkan sebagai union literal. Melampaui ambang itu, ia kembali ke string.

interface untuk sebagian besar kasus, terbuka untuk perluasan dan dioptimalkan lebih baik oleh TypeScript. Alias type berguna untuk union, intersection, tuple, dan tipe mapped. Untuk tipe turunan dari JSON keduanya bisa dipakai; pilih konvensi proyek.

Ya. Setiap objek bersarang menjadi antarmuka tersendiri, dengan nama yang diturunkan dari kunci (user.address -> Address). Untuk struktur yang sangat dalam atau berulang, pertimbangkan JSON Schema dan generator schema-to-TS khusus.

Alat Terkait

Alat ini tersedia dalam bahasa lain