這個工具的用途
從 JSON 樣本產生 TypeScript interface。貼上載荷——API 回應、設定檔、webhook body——即可獲得能直接 放入專案的強型別 interface 宣告。陣列元素型別會自動推論、 巢狀物件成為各自的 interface、可為 null 的欄位以與 null 的聯合輸出。底層使用 quicktype, 完全在你的瀏覽器內運作;載荷不會離開頁面。
使用步驟
貼上 JSON(或載入範例),指定頂層型別名稱,即可在右側讀到 TypeScript。 隨時可從上方分頁切換到其他語言——相同輸入會就地重新產生。
輸入: {"id":42,"name":"devsmiths","createdAt":"2024-03-11T08:24:00Z","stars":1280,"public":true,"contributors":[{"login":"ada","commits":51,"admin":true},{"login":"linus","commits":33,"admin":false}],"homepage":null}
輸出(Typescript):
export interface Root {
id: number;
name: string;
createdAt: string;
stars: number;
public: boolean;
contributors: Contributor[];
homepage: null;
}
export interface Contributor {
login: string;
commits: number;
admin: boolean;
}限制與邊界情況
- 預設使用
interface。若需要typealias (例如為聯合或 mapped type 鋪路),可在選項面板切換 just types;type輸出更接近結構性定義,後續組合 utility type 更彈性。 - 樣本中為
null的欄位會被標為字面null, 而非string | null。產生器只有一份樣本可用, 無法得知該欄位有時是字串。請手動拓寬,或開啟 all optional。 - TypeScript 是唯一具完整 CodeMirror 語法高亮的目標。其他語言以單色 等寬文字呈現以保持頁面輕量;Copy / Download 仍會輸出正確檔案。
- 產生器不會輸出 runtime 驗證器(無 Zod、Valibot、 io-ts)。若要在 runtime 驗證未信任 JSON,可在此產生 interface 後 另寫驗證器,或使用 schema-first 工具(例如 quicktype 的 Zod 輸出)。
- 單樣本推論:樣本中存在的每個欄位都會成為型別的一部分。 樣本中不存在的欄位不會自動變為 optional——若每個欄位都應為 nullable, 請切換 all optional。
- 延伸閱讀:實務上的 JSON 轉 TypeScript 完整講解重新命名 / 收緊步驟。
常見問題
- 我該用 interface 還是 type?要怎麼切換?
- 預設是 interface。若是可能會被延伸的普通物件形狀,用 interface;若是聯合、交集、mapped type、tuple 形狀,用 type。要切換,在選項面板開啟「just types」——產生器會輸出 `type Root = { ... }` 而非 `interface Root { ... }`。注意 type 無法像 interface 那樣靠宣告合併被延伸,因此若是要發布的 public API surface,通常選 interface。
- 為什麼我的欄位被標為 null 而不是 string | null?
- 因為樣本只顯示該欄位為 null,產生器沒有其他資訊可參考。若再給一份含字串值的樣本,quicktype 會擴寬為 `string | null`。變通做法:貼上欄位有實際值的樣本(產生的 interface 只有在你加上時才會保留 `null`),或手動把字面 `null` 改為 `string | null`。
- 可以同時產生 Zod / Valibot schema 嗎?
- 這個 UI 不行。輸出僅含型別;runtime 驗證器不在範圍內,以保持產生器的確定性。Zod 的情境,在這裡產生 interface 後另寫 schema(一對一的對應,可以用 snippet 重構),或用 quicktype CLI 加 `--lang TypeScriptZod` 一次產生。
- JSON 鍵不是合法 TS 識別字時會怎麼處理?
- 含連字號、開頭為數字或特殊字元的鍵會以引號輸出(`'2024-tax-year': number`)並在呼叫端以索引存取(`r['2024-tax-year']`)。TypeScript 樂於接受被引號包覆的鍵;即使 JSON 使用奇形怪狀的鍵名,產生的 interface 在結構上仍合法。
- 為什麼第一次產生會比較慢?
- quicktype 引擎(壓縮後約 700 KB)會在首次使用時載入 Web Worker。之後在本次 session 中被快取——後續產生幾乎即時。Web Worker 確保引擎不會卡住 UI thread,因此「貼上後立刻切走」仍以全速運作。
- 輸出對 prettier / eslint 的折行是否正確?
- 預先格式化為 4 空白縮排、約 100 欄寬。Prettier 預設會重新排版為 2 空白縮排、80 欄;這是語意 no-op 的變動。提交前若想讓輸出像 codebase 其他部分,把它丟給 `prettier --write` 即可。
內容審閱者:ShiangYu Huang