IT
OmnvertGörsel • Belge • Ağ

JSON'dan TypeScript'e

Generate TypeScript interfaces, Zod schemas and types in 9 other languages from any JSON sample — entirely in your browser.
Developer Tools →
JSON sample
546 chars
Generated codets
// Output appears here
0 chars
Input lines
23
Generated lines
0
Top-level types
0
100% client-side: your JSON never leaves your browser. Type generation runs locally via quicktype-core.
About this tool

Dış API ile konuşan TypeScript projelerinin neredeyse hepsinde, bir geliştiricinin örnek JSON yanıtı paylaşıp 'biri bunu tipleyebilir mi' diye sorduğu bir an gelir. Yıllarca yanıt elle yazmaktı: bir Type.ts dosyası açın, interface tanımlayın, anahtarları kopyalayın, opsiyonelleri tahmin edin. Geniş API yüzeyi olan projelerde bu sıkıcılık otomatik JSON'dan TypeScript üreticilerin doğmasını sağladı. Bu araç, gerçek prod kodunda en çok karşılaşılan vakalara göre ayarlanmış bir üreticidir.

Üretici JSON ağacında yürür, her değer için runtime şekline göre tip çıkarır ve adlandırılmış interface'ler (veya type alias — siz seçin) üretir. Primitif türler bariz: "hello" → string, 42 → number, true → boolean, null → null. Diziler elemanları incelenerek tiplenir: hepsi string ise `string[]`, karışık string+number ise `(string | number)[]`, boş dizi ise `unknown[]`. Nesneler en ilginç durumdur: üretici her iç nesneye otomatik ad verir (UserAddress, OrderLineItem) ve onu ayrı interface olarak yayar; bu yaklaşım çıktıyı düz ve idiomatik tutar, kimsenin okuyamayacağı tek devasa iç içe tip yerine.

Optional algılama daha zorlu bir karardır. Bir alan örneklenen tüm nesnelerde varsa zorunludur, en az birinde yoksa optional olur (`field?: type`). Tek nesne örneği için üretici hangi alanların bazen eksik olduğunu bilemez ve hepsini zorunlu olarak işaretler — daha doğru optional algılama için birkaç örnek nesne yapıştırın. 'Her zaman optional' modu, gevşek bir API ile çalışırken tüm alanları her durumda optional işaretler.

Adlandırma da yargı kararı gerektirir. Üretici adları JSON yolundan seçer — root.users[0].address Address olur — ama aynı şekil farklı yollarda görünebilir; bunları paylaşılmış tek interface'e mi birleştireceği yoksa farklı adlarla kopyalayacağı seçilebilir. Varsayılan 'yapıya göre birleştir' modu çoğu zaman doğrudur: aynı anahtarlar ve aynı tipler aynı interface'i üretir.

Çıktı özelleştirme bu aracı basit üreticilerden ayıran şeydir. `interface User` ile `type User =` arasında seçim yapabilirsiniz (interface declaration merging destekler, daha idiomatiktir; type alias union ve intersection için zorunludur). Tüm özelliklere `readonly` ekleyebilirsiniz. Kök tipi açıkça adlandırabilirsiniz. `export` anahtar kelimesini açıp kapatabilirsiniz. Her seçenek farklı codebase'lerde gerçek tercihlere karşılık gelir.

Birkaç gerçek vaka: Bilmediğiniz üçüncü taraf API'sini keşfediyorsunuz — tek yanıtı yapıştırın, üzerine refine edebileceğiniz başlangıç tipini alın. Eski tipsiz koda tip ekliyorsunuz — temsili yanıtı yapıştırın, üretilen tipi yerleştirin, çıkan tip hatalarını çözün. Test fixture'ları için tip üretiyorsunuz — fixture JSON'undan üretmek tek adımdır. Şema yayınlamayan API'ı tersine mühendislik yapıyorsunuz — birkaç temsili yanıt toplayın, contract'a refine edin.

Üretici basit araçların gözden kaçırdığı uç durumları işler. Boş nesneler (`{}`) `Record<string, never>` olarak tiplenir, anlamsız `{}` (TypeScript'te 'null/undefined hariç her şey') yerine. Boş diziler `unknown[]` olarak tiplenir, sessizce `any[]`'e değil — TypeScript kullanmanın anlamını korumak için. Tarih string'leri varsayılan olarak `string`'dir; çoğu codebase deserialization katmanında `Date`'e parse eder.

Performans basit: tipik örnekler için (birkaç yüz KB) milisaniyeler içinde, çok MB'lık örnekler bile bir saniyeden az. Çıktı sözdizimi vurgulu ve tek tıkla kopyalanabilir. Yükleme adımı yoktur — yapıştırdığınız JSON yerel JavaScript ile tarayıcıda işlenir, sunucuya gitmez. Bu gizlilik özelliği gerçek prod verisi tipliyorsanız önemlidir; çoğu online JSON-to-TypeScript üretici JSON'u sunucuya yüklemek zorundadır.

Bu araç Omnvert'in diğer geliştirici utiliti'leriyle doğal eşleşir. Tip ürettikten sonra JSON'u JSON Viewer ile gezebilir veya iki versiyonu JSON Diff ile karşılaştırabilirsiniz. YAML ↔ JSON kaynak format YAML olduğunda yararlıdır. Regex Tester üretim sonrası adları toplu düzenlemek için faydalıdır.

Kullanım senaryoları
  • Bilmediğiniz üçüncü taraf API yanıtından başlangıç tipi üretin.
  • Eski tipsiz JSON konuşan koda TypeScript tipleri ekleyin.
  • Test setup'ı ergonomik olsun diye fixture'ları tipleyin.
  • Birkaç örnek yanıttan contract tersine mühendislik yapın.
  • Otomatik üretilen tipi elle yazılmışla karşılaştırın.
  • Code review sırasında yeni endpoint için hızlı interface üretin.
  • Webhook handler bağlarken payload'u tipleyin.
  • Junior geliştiricilere idiomatik TS nesne tiplerini öğretin.
Nasıl çalışır
  1. 1JSON örneği yapıştırın (nesne, nesne dizisi veya iç içe yapı).
  2. 2Kök tip adı seçin ve interface vs type alias çıktıyı seçin.
  3. 3Codebase stilinize göre readonly, optional ve union birleştirme ayarlayın.
  4. 4Seçenekleri değiştirdikçe TypeScript çıktısı canlı güncellenir.
  5. 5Sonucu Kopyala'ya tıklayın veya .ts indirip projenize bırakın.
  6. 6Discriminated union, literal tip veya branded tip için elle refine edin.
SSS
Bazı alanlar neden optional, bazıları zorunlu?
Örneğiniz çoklu nesne dizisiyse, üretici bir alanı herhangi birinde eksik bulursa optional, hepsinde varsa zorunlu işaretler. Tek nesne örneğinde her alan varsayılan zorunlu; doğru optional algılama için birkaç örnek yapıştırın.
`id` neden `number | string` olarak tiplendi?
Örnekte aynı alan farklı tiplerde görünüyorsa, üretici union üretir. Bu gerçek bir polimorfik alansa doğrudur; örneğinizde bir hata varsa elle düzeltin. Üretici sessizce bir tipi seçip diğerini atmaz.
Boş dizim neden `unknown[]` ve `any[]` değil?
Boş diziler tip bilgisi taşımaz. `unknown[]` çağıranı kullanmadan önce daraltmaya zorlar, tip güvenliğini korur; `any[]` sessizce tip kontrolünü kapatır. Belirli eleman tipi istiyorsanız elle değiştirin.
interface mi type alias mı tercih etmeliyim?
Interface nesne şekilleri için idiomatiktir ve declaration merging destekler. Type alias union, intersection ve bazı gelişmiş şekiller için zorunludur. Çoğu codebase düz nesne için interface'i varsayılan kabul eder.
Tarihler nasıl işleniyor?
JSON'daki tarih string'leri `string` olarak tiplenir çünkü API sınırında öyledirler. Çoğu codebase deserialization katmanında `Date`'e parse eder. Doğrudan `Date` istiyorsanız tipi elle değiştirin.
Yapıştırdıklarım sunucuya gönderiliyor mu?
Hayır. Üretici tamamen tarayıcınızda çalışır; hiçbir şey yüklenmez veya loglanmaz. Network sekmesinde dış istek olmadığını görebilirsiniz.
Literal tip veya enum ne olacak?
Üretici enum'u otomatik algılamaz çünkü örnek 'kapalı küme' olduğunu kanıtlayamaz. Bir alan domaininizde her zaman birkaç literal string'den biriyse, tipi elle literal union'a çevirin.
OpenAPI veya JSON Schema'dan tip üretir mi?
Hayır — bu araç JSON örneğinden çalışır, şemadan değil. OpenAPI veya JSON Schema'nız varsa openapi-typescript veya json-schema-to-typescript kullanın.