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,提升程式碼可讀性和型別安全。

使用方法

  1. 在左側輸入框貼上 JSON 內容,或點擊「上傳」按鈕選擇 .json/.txt 檔案,或點擊「範例」載入內建樣本。
  2. 點擊工具列右側的 interface 名稱按鈕(或齒輪圖示),自訂根 interface 名稱(預設 Root)、開啟可選欄位/唯讀欄位。
  3. 工具會自動轉換(輸入後 400ms 防抖);在右側查看生成的 TypeScript interface 程式碼,CodeMirror 高亮便於閱讀。
  4. 選擇縮排風格(2 空格或 4 空格),調整工具列左側/右側面板寬度以獲得最佳檢視體驗。
  5. 點擊「複製」將 TS 程式碼複製到剪貼簿,或點擊「下載」儲存為 `${interfaceName}.ts` 檔案(如 User.ts)。
  6. 將程式碼貼到專案 `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 型別判斷規則
nullnullnullJSON null 直接對應為 TS null 型別
undefinedundefinedundefinedundefined 值對應為 TS undefined(僅在執行時存在)
booleantrue / falsebooleantypeof boolean 對應為 TS boolean
integer1, 100, -9999number整數和浮點數都對應為 TS number
float3.14, -0.5, 1e10number所有數字字面量對應為 number(TS 不區分整數和浮點)
string"Alice", "台北"stringtypeof 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 專案中的差異:

能力維度interfacetype 別名說明
物件型別描述✓ (首選)✓ (也支援)兩者都支援,本工具生成 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 === undefinedname?: string可選欄位、可缺省資料
唯讀欄位 (readonly): 關閉(預設)name: string通用型別,欄位可寫
唯讀欄位 (readonly): 開啟所有欄位統一處理readonly name: string不可變狀態、設定、DTO、API 響應
兩者都開啟同時滿足readonly name?: stringAPI 響應快照、可選設定

Privacy & Security

本 JSON 轉 TypeScript 工具所有操作完全在你的瀏覽器本地完成:JSON 解析、型別推斷、interface 生成全部透過瀏覽器 JavaScript 在用戶端執行,不會透過網路向任何伺服器傳送 JSON 內容、上傳的檔案或生成的程式碼。檔案上傳使用瀏覽器原生 FileReader API 直接讀取到記憶體,不經過任何中介服務。不使用 Cookie 追蹤,不收集任何使用者輸入或使用資料。關閉或重新整理頁面後,所有輸入和輸出內容自動從記憶體清除。適合處理含 API 金鑰、token、敏感業務資料的 JSON。

Authoritative References