JSON 轉 TypeScript
免費線上 JSON 轉 TypeScript 工具,將 JSON 資料自動推斷為標準 TS interface 型別定義。支援嵌套物件子介面、聯合陣列、可選欄位與 readonly 只讀欄位,2/4 空格縮排可選,純瀏覽器本地處理不上傳。
相關推薦
關於 JSON 轉 TypeScript:把 JSON 資料自動變成 TS 型別
JSON 轉 TypeScript 是把 JSON 格式的資料(JSON 物件或 JSON 陣列)轉換為 TypeScript interface 型別宣告的過程。JSON(JavaScript Object Notation)作為 REST API、設定檔、記錄檔的標準資料格式在前後端開發中無處不在,而 TypeScript 是 JavaScript 的超集,為程式碼加入了靜態型別檢查。開發中常需要根據 API 回傳的 JSON 寫一份對應的 TS interface,手寫容易出錯且耗時,本工具就是要把這個過程自動化。
本工具的核心是把 JSON 物件的結構自動推斷為 TypeScript interface。每個 JSON 物件的 key 變成 interface 的屬性名,每個 value 的字面量型別被對應為對應的 TS 型別:字串對應為 `string`、數字對應為 `number`、布林對應為 `boolean`、null 對應為 `null`、陣列對應為 `T[]`、嵌套物件對應為獨立的子 interface。整個過程在瀏覽器本地完成,無需後端服務,幾秒即可生成完整可用的型別定義。
型別推斷是 JSON 轉 TypeScript 的核心。JSON 本身只有 6 種基本型別(null、boolean、number、string、array、object),而 TypeScript 的基礎型別系統包括 string、number、boolean、null、undefined、any、unknown、void、never、object、Array、T[]、聯合型別 (A | B) 等。本工具的 getTsType 函式會按 value 的 typeof 和具體形式做對應:typeof null 對應為 `null`;typeof undefined 對應為 `undefined`;typeof boolean 對應為 `boolean`;typeof number 對應為 `number`;typeof string 對應為 `string`;Array.isArray() 命中時按陣列處理。
嵌套物件處理是工具的關鍵能力。當 JSON 包含嵌套物件時,工具會遞迴生成獨立子 interface,避免型別重複。例如 `address: { street, city }` 會生成 `RootAddress` 子 interface,主 interface 中透過 `address: RootAddress` 引用。子 interface 命名規則為「父 interface 名 + 欄位名首字母大寫」,保持語意清晰。processedTypes Set 用於去重,相同結構的嵌套物件只生成一次 interface。
陣列型別推斷有三種處理模式。第一,陣列為空時生成 `any[]` 兜底(因為無法推斷元素型別)。第二,所有元素型別一致時生成 `T[]` 形式(如 `string[]`、`User[]`)。第三,元素型別不一致時生成聯合陣列 `(A | B)[]`(如 `(string | number)[]`)。這種區分讓生成的型別既準確又易讀,避免不必要的 `any[]` 過度使用。
可選欄位(?)是 TypeScript strict 模式下的重要特性。開啟後,工具會掃描每個欄位的值,如果是 null 或 undefined,就在 interface 中加入 `?` 修飾符:`name?: string` 表示該欄位可缺省。這對於後端 API 回傳的可選欄位非常有用,避免存取 undefined 欄位時的執行時錯誤。唯讀欄位(readonly)則強調不可變性,生成的程式碼形如 `readonly id: number`,適合定義配置、狀態快照、DTO 等場景。
interface vs type 別名是 TypeScript 使用者的常見選擇。本工具選擇統一生成 interface,原因是 interface 是 TypeScript 描述物件型別的標準方式,支援宣告合併(declaration merging)、implements 關鍵字、extends 繼承,更符合 React、Vue、Angular 等主流前端專案的編碼規範。type 別名在描述聯合型別、交叉型別、函式型別時更強大,但物件型別首選 interface。
即時轉換是工具的實用功能。使用者輸入 JSON 後 400ms 防抖自動觸發轉換,無需手動點擊按鈕。配合 CodeMirror 的 TypeScript 語法高亮(透過 @codemirror/lang-javascript 的 typescript: true 選項),使用者可以即時看到生成的 interface,並修改輸入觀察輸出變化。這種即時回饋顯著提升了型別設計效率,尤其在快速試錯時。
JSON 錯誤自修復提升了工具的容錯性。現實中使用者輸入的 JSON 經常存在小問題:尾隨逗號、單引號、缺引號、註解等。內建 tryFixJSON 函式會在 JSON.parse 失敗時自動嘗試修復常見錯誤,修復成功後會提示使用者;如果仍無法解析,會在右側顯示具體錯誤位置和原因,引導使用者修正。這一設計把工具的實用性提升了一個台階,避免因為小錯誤反覆手動調整。
純前端處理是本工具的核心架構。所有 JSON 解析、型別推斷、interface 生成都在瀏覽器 JavaScript 中執行,不向任何伺服器傳送資料。這種設計有兩點核心好處:第一,JSON 內容可能包含使用者敏感資訊(API key、token、使用者資料),本地處理完全消除洩漏風險;第二,轉換速度僅受裝置 CPU 限制,1MB 以內的 JSON 幾乎瞬時轉換完成,無需等待網路往返。這與一些需要註冊登入的線上服務相比,提供了更好的隱私保護和效能。
適用場景
- 前端開發時把 REST API 或 GraphQL 回傳的 JSON 響應快速轉為 TS interface,避免手寫型別定義。
- React/Vue/Angular 專案的 Props、State、組件參數需要型別宣告時,從樣本 JSON 幾秒生成。
- 全端 TypeScript 專案中,前後端共享型別定義,後端 mock JSON 即可作為前端 type source of truth。
- 對接第三方 API 時(快遞、天氣、支付等)快速生成對應的 TypeScript 介面,免去查閱文件。
- 從 mock 資料、測試 fixture、JSON 設定檔反推型別定義,用於加強型別安全和 IDE 智慧提示。
- 資料庫 ORM 匯出的 JSON Schema 轉換為 TypeScript interface,整合到 Node.js 後端 DTO 定義。
- 學習 TypeScript 時把已有 JSON 轉為 interface 範例,理解嵌套型別、聯合型別、可選欄位的寫法。
- 程式碼重構時把散落的 JS object literal 轉為正式 interface,提升程式碼可讀性和型別安全。
使用方法
- 在左側輸入框貼上 JSON 內容,或點擊「上傳」按鈕選擇 .json/.txt 檔案,或點擊「範例」載入內建樣本。
- 點擊工具列右側的 interface 名稱按鈕(或齒輪圖示),自訂根 interface 名稱(預設 Root)、開啟可選欄位/唯讀欄位。
- 工具會自動轉換(輸入後 400ms 防抖);在右側查看生成的 TypeScript interface 程式碼,CodeMirror 高亮便於閱讀。
- 選擇縮排風格(2 空格或 4 空格),調整工具列左側/右側面板寬度以獲得最佳檢視體驗。
- 點擊「複製」將 TS 程式碼複製到剪貼簿,或點擊「下載」儲存為 `${interfaceName}.ts` 檔案(如 User.ts)。
- 將程式碼貼到專案 `types/` 目錄或 `src/types/` 目錄中,按需 import 使用。
功能特點
- 智慧型別推斷:自動識別 null、boolean、number、string、array、object 等 TypeScript 型別,對應為原生 TS 語法。
- 嵌套物件自動展開:為嵌套物件自動建立獨立子 interface(如 RootAddress),保持型別層級清晰、避免冗餘。
- 陣列型別智慧處理:元素型別一致生成 `T[]`,混合型別生成聯合陣列 `(A | B)[]`,空陣列兜底為 `any[]`。
- 可選欄位標記:開啟後自動偵測 null/undefined 欄位,加入 `?` 修飾符,生成符合 TypeScript strict 模式的程式碼。
- 唯讀欄位支援:開啟後為所有欄位加入 `readonly` 修飾符,適合不可變狀態、設定、DTO 等場景。
- interface 名稱自訂:根 interface 名稱可設定(預設 Root),下載檔名以該名稱命名(如 User.ts)。
- 2/4 空格縮排可選:工具列一鍵切換 2 空格(ESLint 預設)和 4 空格縮排風格。
- 即時自動轉換:輸入 JSON 後 400ms 防抖自動轉換,無需點擊按鈕;支援貼上、檔案上傳、範例三種輸入方式。
- JSON 錯誤自修復:內建 tryFixJSON 修復函式,自動處理尾隨逗號、單引號、缺引號等常見語法錯誤。
- TypeScript 程式碼高亮:右側輸出使用 CodeMirror + JavaScript (TypeScript) 高亮,可讀性強。
- 複製與下載:一鍵複製到剪貼簿,或下載為標準 .ts 檔案直接用於前端專案。
- 純瀏覽器本地處理:所有 JSON 解析、型別推斷、interface 生成都在瀏覽器 JavaScript 中完成,原始資料不上傳。
常見問題
怎麼把 JSON 轉成 TypeScript interface?
把 JSON 內容貼到左側輸入框,工具會自動推斷每個欄位的型別(string、number、boolean、array、object 等),生成標準的 TypeScript interface 定義。嵌套物件會自動建立子 interface 並保持型別層級清晰。輸入 400ms 後自動轉換,無需手動點擊。
支援生成 type 別名還是 interface?
本工具統一生成 TypeScript interface 宣告(不支援 type 別名)。interface 是 TypeScript 中描述物件型別的標準方式,支援宣告合併(declaration merging)和 implements 關鍵字,是 React、Vue、Angular 等前端專案的首選。
如何標記可選欄位?
在設定中開啟「可選欄位(?)」後,工具會自動偵測值為 null 或 undefined 的欄位,並在 interface 中加入 `?` 修飾符。例如 `name?: string` 表示該欄位可缺省。生成的程式碼符合 TypeScript strict 嚴格模式規範。
如何生成唯讀欄位?
在設定中開啟「唯讀欄位(readonly)」後,所有欄位會自動加入 `readonly` 修飾符,例如 `readonly id: number`。這樣生成的 interface 強調不可變性,適合定義配置、狀態快照或 DTO 等場景。
陣列型別如何處理?
工具會分析陣列元素的型別。如果所有元素型別一致,生成 `T[]` 形式(如 `string[]`);如果型別不一致,生成聯合陣列 `(A | B)[]` 形式(如 `(string | number)[]`);如果陣列為空,生成 `any[]` 兜底。
嵌套物件會生成多個 interface 嗎?
會的。每個嵌套物件都會生成獨立的子 interface,命名規則為「父 interface 名 + 欄位名首字母大寫」。例如 Root 包含 address 物件,會同時生成 Root、RootAddress 兩個 interface。子 interface 自動引用,避免型別重複定義。
interface 名稱可以自訂嗎?
可以。點擊工具列右側的 interface 名稱按鈕(或在設定中修改),即可自訂根 interface 的名稱(預設 Root)。下載的 .ts 檔案也會以該名稱命名(如 `User.ts`)。子 interface 的命名會基於根名稱自動生成。
下載的 .ts 檔案能直接用於專案嗎?
可以。生成的程式碼符合 TypeScript 編碼規範,包含完整的型別定義、嵌套 interface、聯合型別推斷等,可直接複製到 React、Vue、Angular 或 Node.js 專案中使用。下載檔名為 `${interfaceName}.ts`,如 User.ts。
JSON 解析失敗怎麼辦?
如果 JSON 存在尾隨逗號、缺引號、單引號代替雙引號等常見錯誤,工具會自動呼叫 tryFixJSON 嘗試修復。修復成功後會提示使用者;如果無法修復,會在右側顯示具體錯誤位置和原因。可使用 2/4 空格縮排重新格式化後再嘗試。
支援哪些 JSON 資料結構?
支援所有合法 JSON 資料結構:基本型別(null、boolean、number、string)、陣列(一維或多維)、嵌套物件(任意深度)、混合型別陣列(生成聯合型別)。不支援的輸入:JSON 中含函式、Symbol、undefined 等 JavaScript 特殊值(這些不是合法 JSON)。
縮排空格數可以選嗎?
可以。工具列右側有縮排設定下拉選單,支援 2 空格和 4 空格兩種風格。2 空格是 ESLint/Prettier 預設風格,4 空格適合需要更寬鬆縮排的專案。生成的程式碼整體保持一致縮排,便於閱讀和維護。
和 JSON Schema、Zod 等型別庫有什麼區別?
JSON Schema 適合執行時資料驗證(API 邊界、使用者輸入校驗);Zod/yup 是 TypeScript 友好的執行時校驗庫,可以從 schema 反向生成 TS 型別;本工具是輕量的純型別定義生成器,不做執行時驗證,專注前端靜態型別定義場景,速度更快、零相依性。
故障排查
生成的 interface 不正確怎麼辦?
常見原因:JSON 解析失敗、嵌套物件識別錯誤、陣列型別推斷錯誤。解決:1) 檢查 JSON 是否合法(用 JSON 格式化工具);2) 如果是嵌套物件,確認子 interface 引用關係;3) 如果是陣列,確認元素型別是否一致;4) 重新生成或手動微調生成的程式碼。生成的 interface 是初稿,需要根據專案實際 API 調整細節。
下載的 .ts 檔案在專案裡編譯報錯?
可能原因:1) tsconfig.json 未啟用 strict 模式但生成了 readonly 欄位;2) 介面名與專案內其他型別衝突;3) 欄位名是 TypeScript 關鍵字(如 `class`、`type`)。解決:調整 tsconfig 的 strict 設定、修改 interface 名稱、對衝突欄位加引號轉義(如 `"class": string`)。
JSON 中包含嵌套陣列,型別推斷不對?
本工具對多維陣列(如 `[[1, 2], [3, 4]]`)會遞迴處理,最終生成 `number[][]`。如果嵌套陣列元素型別不一致,工具會生成 `((A | B)[])[]` 形式。空陣列始終生成 `any[]`,因為無法推斷元素型別。
null 值被對應為 `null` 型別而不是可選欄位?
預設情況下,工具會把 JSON 中的 null 值對應為 TS 的 `null` 型別(如 `middleName: null`)。如果希望生成可選欄位(`middleName?: string`),需要:1) 開啟「可選欄位」選項(推薦);2) 或者將 JSON 中的 null 值改為欄位缺失;3) 或者在生成後手動將 `null` 改為 `string | null` 或 `?`。
interface 名稱和下載檔名不一致?
兩者在工具中是同一個值,由「interface 名稱」設定控制(預設 Root)。下載的檔名就是 `${interfaceName}.ts`。如果兩者看起來不一致,請檢查是否有多個分頁開啟導致設定不同步。建議修改設定後重新生成一次。
生成的程式碼有大量 `any` 型別?
可能原因:1) JSON 包含無法識別的型別(實際是 object 但被解析錯誤);2) 陣列為空導致 any[] 兜底;3) 欄位值是 null 且未開啟可選欄位。解決:檢查 JSON 資料的完整性、補充範例資料讓工具推斷更精確、對始終為空的陣列手動指定型別(如 `User[]`)。
想要把生成的 interface 和現有型別合併?
TypeScript interface 支援宣告合併(declaration merging),同名 interface 會自動合併屬性。只需在專案中建立同名 interface 並 export,然後合併:例如工具生成 `export interface User { id: number }`,你在專案中寫 `export interface User { name: string }`,兩者會自動合併為 `{ id: number; name: string }`。
術語表
- JSON(JavaScript Object Notation)
- 輕量級資料交換格式,基於 JavaScript 物件語法但獨立於程式語言。支援物件 ({}), 陣列 ([]), 字串, 數字, 布林, null 六種基本型別。廣泛用於 REST API、前後端資料傳輸、設定檔、記錄檔等場景。
- TypeScript
- 由 Microsoft 開發的 JavaScript 超集,為 JavaScript 添加了靜態型別定義、介面、泛型等特性。TypeScript 程式碼會被編譯為純 JavaScript 後執行於瀏覽器或 Node.js。是 React、Vue、Angular 等現代前端專案的首選語言。
- interface(介面)
- TypeScript 中描述物件型別的關鍵字,語法為 `interface Name { prop: type; }`。支援宣告合併(同名 interface 自動合併)、implements(類別實作介面)、extends(介面繼承)。是 TypeScript 描述物件形狀的主要方式。
- type 別名
- TypeScript 中給型別起別名的關鍵字,語法為 `type Name = ...`。可用於定義聯合型別 (`A | B`)、交叉型別 (`A & B`)、函式型別等。比 interface 更靈活但不支援宣告合併。本工具統一使用 interface 而非 type。
- 型別推斷(Type Inference)
- 本工具根據 JSON value 的 typeof 和具體形式自動決定對應 TS 型別的過程。例如 typeof string 對應為 string,Array.isArray() 命中時按陣列處理,typeof object 命中時生成獨立子 interface。
- 可選欄位(?)
- TypeScript 中表示欄位可缺省的修飾符。`name?: string` 表示 name 欄位可不存在(值為 undefined)。開啟本工具的「可選欄位」選項後,值為 null 或 undefined 的欄位會自動加入 `?`。
- 唯讀欄位(readonly)
- TypeScript 中表示欄位不可變的修飾符。`readonly id: number` 表示 id 欄位在物件建立後不能被重新賦值。開啟本工具的「唯讀欄位」選項後,所有欄位會自動加入 `readonly`。
- 聯合型別(Union Type)
- TypeScript 中表示值可以是多種型別之一的語法,寫作 `A | B`。本工具在陣列元素型別不一致時使用,如 `(string | number)[]` 表示陣列元素可能是 string 或 number。
- 陣列型別(Array Type)
- TypeScript 中表示陣列的語法,有兩種形式:泛型形式 `Array<T>` 和簡寫形式 `T[]`。本工具統一使用簡寫形式。本工具有三種陣列型別生成模式:一致型別 `T[]`、混合型別 `(A | B)[]`、空陣列 `any[]`。
- 嵌套介面(Nested Interface)
- 在 interface 中引用其他 interface 形成型別層級。本工具為每個嵌套物件生成獨立子 interface,主 interface 透過屬性名引用。如 Root 引用 RootAddress,RootAddress 可以獨立被其他型別引用。
- TypeScript strict 模式
- TypeScript 編譯器的嚴格模式,包含 noImplicitAny、strictNullChecks、strictFunctionTypes 等多個子選項。開啟 strictNullChecks 後,null 和 undefined 是獨立型別,不能賦給其他型別變數。本工具生成的可選欄位與 strict 模式完全相容。
- DTO (Data Transfer Object)
- 資料傳輸物件,用於在不同層(如 API 與 Service 層)之間傳遞資料。在 TypeScript 專案中通常用 interface 描述,配合 readonly 強調不可變性。本工具是生成 DTO 型別定義的常用工具。
- 宣告合併(Declaration Merging)
- TypeScript interface 的特性:同名 interface 會自動合併屬性。常用於擴展第三方庫的型別定義。本工具生成的 interface 支援與專案中其他同名 interface 合併,便於漸進式型別擴展。
- tsconfig.json
- TypeScript 專案的設定檔,位於專案根目錄。包含 compilerOptions(target、module、strict 等)、include、exclude 等設定。本工具生成的 .ts 檔案可以放入任何標準 tsconfig 專案中使用。
- tryFixJSON
- 本工具內建的 JSON 修復函式,會自動處理尾隨逗號、單引號代替雙引號、缺引號的 key、註解等常見 JSON 語法錯誤。在 JSON.parse 失敗時自動呼叫,修復成功後會通知使用者並繼續轉換。
JSON 型別到 TypeScript 型別的對應規則
本工具的 getTsType 函式根據 JSON value 的形式推斷 TypeScript 型別的完整規則:
| JSON 值 | 範例 | TypeScript 型別 | 判斷規則 |
|---|---|---|---|
null | null | null | JSON null 直接對應為 TS null 型別 |
undefined | undefined | undefined | undefined 值對應為 TS undefined(僅在執行時存在) |
boolean | true / false | boolean | typeof boolean 對應為 TS boolean |
integer | 1, 100, -9999 | number | 整數和浮點數都對應為 TS number |
float | 3.14, -0.5, 1e10 | number | 所有數字字面量對應為 number(TS 不區分整數和浮點) |
string | "Alice", "台北" | string | typeof string 對應為 TS string |
empty array | [] | any[] | 空陣列無法推斷元素型別,兜底為 any[] |
homogeneous array | [1, 2, 3] | T[] (如 number[]) | 元素型別一致時生成單一陣列型別 |
mixed array | [1, "a"] | (A | B)[] (如 (number | string)[]) | 元素型別不一致時生成聯合陣列型別 |
object | {a: 1, b: "x"} | SubInterface(如 Root) | 嵌套物件生成獨立子 interface 並引用 |
interface vs type 別名對比
本工具選擇生成 interface 而非 type 別名的原因,以及兩者在 TypeScript 專案中的差異:
| 能力維度 | interface | type 別名 | 說明 |
|---|---|---|---|
| 物件型別描述 | ✓ (首選) | ✓ (也支援) | 兩者都支援,本工具生成 interface |
| 宣告合併 | ✓ (同名自動合併) | ✗ (重複宣告會報錯) | interface 支援漸進式擴展,type 不行 |
| implements/extends | ✓ (類別可 implements) | △ (僅物件 type 可被 implements) | interface 在 OOP 場景更自然 |
| 聯合型別 (A | B) | ✗ | ✓ | type 描述聯合型別更簡潔 |
| 交叉型別 (A & B) | ✗ | ✓ | type 描述交叉型別更簡潔 |
| 函式型別 | △ (需要 call signature) | ✓ (直接定義) | type 定義函式型別更直觀 |
| 效能(大量型別時) | 略快 | 略慢 | interface 在編譯時增量合併更快 |
| 本工具選擇 | ✓ 統一使用 | ✗ | 本工具專注物件型別,interface 是最佳選擇 |
可選欄位與唯讀欄位的生成規則
本工具的兩個開關選項對生成程式碼的影響和最佳使用場景:
| 選項 | 觸發條件 | 生成語法 | 最佳使用場景 |
|---|---|---|---|
| 可選欄位 (?): 關閉 | (預設) | name: string | 所有欄位必填,型別嚴格 |
| 可選欄位 (?): 開啟 | value === null || value === undefined | name?: string | 可選欄位、可缺省資料 |
| 唯讀欄位 (readonly): 關閉 | (預設) | name: string | 通用型別,欄位可寫 |
| 唯讀欄位 (readonly): 開啟 | 所有欄位統一處理 | readonly name: string | 不可變狀態、設定、DTO、API 響應 |
| 兩者都開啟 | 同時滿足 | readonly name?: string | API 響應快照、可選設定 |
Privacy & Security
本 JSON 轉 TypeScript 工具所有操作完全在你的瀏覽器本地完成:JSON 解析、型別推斷、interface 生成全部透過瀏覽器 JavaScript 在用戶端執行,不會透過網路向任何伺服器傳送 JSON 內容、上傳的檔案或生成的程式碼。檔案上傳使用瀏覽器原生 FileReader API 直接讀取到記憶體,不經過任何中介服務。不使用 Cookie 追蹤,不收集任何使用者輸入或使用資料。關閉或重新整理頁面後,所有輸入和輸出內容自動從記憶體清除。適合處理含 API 金鑰、token、敏感業務資料的 JSON。
Authoritative References
- TypeScriptTypeScript interface 官方文件
- TypeScriptTypeScript 入門手冊
- MDNJSON 規範 - MDN Web Docs
- TypeScriptTypeScript Playground 線上試用
- TypeScripttsconfig.json 設定參考
- ZodZod - TypeScript 優先的 schema 驗證函式庫
- JSON 壓縮
- CSV 轉 JSON
- JSON 轉 CSV
- JSON Diff
- JSON Escape / Unescape
- JSON 扁平化
- JSON 格式化
- JSON 產生器
- JSONPath 查詢
- JSON 合併
- JSON 修復
- JSON Schema 驗證器
- JSON 排序
- JSON Stringify
- JSON 轉 HTML 表格
- JSON 轉 Java
- JSON 轉 Markdown
- JSON 轉 SQL
- JSON 轉 TOML
- JSON 轉 TypeScript
- XML 轉 JSON
- JSON 轉 XML
- YAML 轉 JSON
- JSON 轉 YAML
- JSON 轉 Go
- JSON 轉 Rust
- JSON 轉 Swift
- JSON轉C#
- JSON 轉 C++
- JSON 轉 PHP
- JSON 轉 Python