JSON 轉 TypeScript 型別指南
JSON(更新於 2026年6月2日)
為什麼需要 JSON 轉 TypeScript 型別
在前後端協作中,API 回應通常是 JSON 格式。手動編寫 TypeScript 介面既耗時又容易出錯,特別是當介面欄位多、巢狀深時。自動產生型別定義可以:
- 減少手寫介面的工作量
- 避免欄位名拼寫錯誤
- 保持前後端型別一致
- 加速程式碼補全和重構
基本轉換規則
簡單物件
{
"id": 1,
"name": "張三",
"active": true
}
產生結果:
interface RootObject {
id: number;
name: string;
active: boolean;
}
型別對應規則
| JSON 值 | TypeScript 型別 |
|---|---|
"hello" |
string |
42 |
number |
3.14 |
number |
true / false |
boolean |
null |
null |
[1, 2, 3] |
number[] |
{"a": 1} |
巢狀介面 |
使用 JSON→TypeScript工具
步驟一:取得 JSON 資料
從瀏覽器開發者工具的 Network 面板複製 API 回應,或直接貼上已有的 JSON 資料。
步驟二:開啟工具
進入 JSON→TypeScript工具,將 JSON 貼到輸入區域。
步驟三:設定產生選項
- 根介面名稱:預設
RootObject,建議改為語義化名稱(如UserInfo) - 匯出修飾詞:選擇
interface或type - 可選欄位:值為
null的欄位是否標記為可選(?) - 唯讀修飾詞:是否為所有欄位新增
readonly
步驟四:產生並複製
點擊產生按鈕,TypeScript 型別定義即刻輸出,一鍵複製到剪貼簿。
處理巢狀物件
深層巢狀的 JSON 會自動拆分為多個介面:
{
"user": {
"profile": {
"avatar": "url",
"bio": "text"
}
}
}
產生:
interface Profile {
avatar: string;
bio: string;
}
interface User {
profile: Profile;
}
interface RootObject {
user: User;
}
建議將產生的介面拆分到獨立檔案中,按模組組織。
處理聯合型別
當陣列中包含不同型別的元素時:
{
"items": ["text", 42, true]
}
工具會產生聯合型別:
interface RootObject {
items: (string | number | boolean)[];
}
處理可選欄位
API 回應中某些欄位可能不存在,常見處理方式:
- 欄位值為
null時標記為可選:bio?: string | null - 欄位缺失時標記為可選:
bio?: string - 在工具中勾選「null 欄位標記為可選」即可自動處理
實戰:從真實 API 產生型別
- 開啟瀏覽器開發者工具 → Network 面板
- 找到目標 API 請求,右鍵 → Copy Response
- 貼到 JSON→TypeScript工具
- 設定根介面名稱(如
ApiResponse) - 產生後複製到專案的
types/目錄
常見問題
| 問題 | 原因 | 解決方法 |
|---|---|---|
| 型別過於具體 | 單條資料推斷型別 | 補充多條樣本資料 |
| 巢狀層級太深 | JSON 結構複雜 | 手動合併部分介面 |
| 陣列元素型別不一致 | 混合型別陣列 | 使用聯合型別或泛型 |
| 日期變成 string | JSON 無日期型別 | 手動改為 Date 型別 |
進階技巧
- 用 JSON格式化 先整理 JSON 再產生型別
- 同樣方法可用 JSON→Go工具 產生 Go 結構體
- 產生的介面建議搭配 Zod 做執行時校驗
- 大型專案推薦用 openapi-typescript 從 Swagger 產生
總結
從 JSON 自動產生 TypeScript 型別是提升開發效率的利器。JSON→TypeScript工具 讓你在幾秒內完成型別定義,避免手動編寫的繁瑣和錯誤。結合本文的巢狀處理、可選欄位等技巧,可以應對各種複雜場景。
#JSON#TypeScript#类型生成#接口定义#开发