ToolDeck

تبدیل JSON به TypeScript

تولید interface های TypeScript از JSON

یک مثال امتحان کنید
نام interface اصلی:

ورودی JSON

خروجی TypeScript

به‌صورت محلی اجرا می‌شود · جای‌گذاری اسرار امن است
interface های TypeScript اینجا نمایش داده می‌شوند…

تبدیل JSON به TypeScript چیست؟

یک بار JSON را جایگذاری کنید و interface های TypeScript دریافت کنید — قراردادهای تایپ‌شده‌ای که دقیقاً مشخص می‌کنند یک شیء چه ویژگی‌هایی دارد و هر کدام چه نوعی هستند. بدون آن‌ها، داده‌ای که از JSON.parse() می‌آید به‌صورت any دریافت می‌شود و هیچ کمکی از ویرایشگر یا بررسی کامپایلر روی دسترسی به ویژگی‌ها یا انتساب آن‌ها ندارید. تبدیل JSON به TypeScript این ایمنی را بدون نوشتن دستی interface ها فراهم می‌کند.

TypeScript تمام شش نوع مقدار JSON را پوشش می‌دهد: string، number، boolean، null، object و array. هر شیء JSON تودرتو به interface جداگانه‌ای با نام مخصوص تبدیل می‌شود. آرایه‌ها بر اساس اولین عنصرشان تایپ می‌شوند. نتیجه با آنچه JSON.parse() در زمان اجرا واقعاً برمی‌گرداند مطابقت دارد، بنابراین interface ها داده واقعی را منعکس می‌کنند نه حدس و گمان.

نوشتن دستی interface ها برای JSON های بزرگ یا عمیقاً تودرتو کسل‌کننده و مستعد خطاست. یک مولد JSON به TypeScript ساختار را به‌طور خودکار می‌خواند، تودرتو بودن را بازگشتی پردازش می‌کند و کد interface تمیز را در چند ثانیه تولید می‌کند. این به‌ویژه هنگام اتصال به یک API ناآشنا، نمونه‌سازی با داده آزمایشی، یا مهاجرت یک پایگاه کد JavaScript به TypeScript مفید است. همچنین شما را از ردیابی دستی نام‌ها و نوع‌های ویژگی‌های تودرتو رها می‌کند تا بتوانید روی منطق برنامه تمرکز کنید، نه کدهای تکراری.

چرا از مولد JSON به TypeScript استفاده کنیم؟

تولید دستی interface های TypeScript برای اشیاء کوچک عملی است، اما با ساختارهای تودرتو یا پاسخ‌های بزرگ API به‌سرعت ناکارآمد می‌شود. یک پاسخ API با ۵۰ فیلد و سه سطح تودرتو را در نظر بگیرید — نوشتن دستی آن یعنی ده‌ها interface، که هر کدام منبع بالقوه‌ای برای اشتباه تایپی یا فیلدهای nullable از قلم افتاده هستند. یک مولد خودکار در چند میلی‌ثانیه مجموعه کامل را تولید می‌کند و احتمال ناهماهنگی نوع بین کد شما و داده‌ای که مصرف می‌کند را کاهش می‌دهد. فراتر از دقت، تایپ‌های شما را با قرارداد واقعی API همگام نگه می‌دارد. وقتی یک سرویس شکل پاسخ خود را تغییر می‌دهد، کافیست JSON به‌روزشده را جایگذاری کرده و دوباره تولید کنید — بسیار سریع‌تر از پیدا کردن هر ویژگی‌ای که در یک فایل interface دستی جابجا شده است.

تولید فوری interface ها
هر بار JSON را جایگذاری کنید و interface های تایپ‌شده صحیح را در چند میلی‌ثانیه دریافت کنید. بدون پیکربندی، بدون نیاز به مرحله ساخت.
🔒
حفظ حریم خصوصی داده
تمام تبدیل در مرورگر شما انجام می‌شود. JSON شما هرگز دستگاهتان را ترک نمی‌کند، که هنگام کار با داده تولیدی یا پاسخ‌های API داخلی اهمیت دارد.
📋
پردازش خودکار ساختارهای تودرتو
اشیاء تودرتو interface های جداگانه با نام مخصوص تولید می‌کنند. آرایه‌ها، فیلدهای nullable و نوع‌های ترکیبی همه بدون دخالت دستی حل می‌شوند.
🌐
بدون حساب یا نصب
در هر مرورگر مدرنی کار می‌کند. هیچ پکیج npm برای نصب، هیچ ابزار CLI برای پیکربندی، و هیچ فرم ثبت‌نامی برای پر کردن وجود ندارد.

موارد استفاده JSON به TypeScript

یکپارچه‌سازی API در Frontend
یک پاسخ JSON از REST یا GraphQL را جایگذاری کنید تا interface هایی برای کامپوننت‌های React، Angular یا Vue خود تولید کنید. props و state با تایپ ایمن از خطاهای زمان اجرا جلوگیری می‌کنند. همچنین می‌توانید interface های تولیدشده را بین frontend و backend در یک monorepo به اشتراک بگذارید تا هر دو طرف روی یک شکل داده توافق داشته باشند.
تایپ‌بندی پاسخ در Backend
سرویس‌های Node.js و Deno که API های شخص ثالث را مصرف می‌کنند از interface های تولیدشده بهره‌مند می‌شوند. قرارداد را یک‌بار تعریف کنید و ناهماهنگی‌های شکل را در زمان کامپایل شناسایی کنید. interface های تولیدشده همچنین مستنداتی سبک برای مصرف‌کنندگان سرویس هستند و نیاز به فایل‌های schema یا صفحات wiki جداگانه را کاهش می‌دهند.
فایل‌های پیکربندی DevOps
ابزارهای زیرساختی مانند AWS CDK یا Pulumi از پیکربندی‌های JSON استفاده می‌کنند. نوع‌های TypeScript برای آن پیکربندی‌ها تولید کنید تا قبل از استقرار آن‌ها را اعتبارسنجی کنید. این خطاهای استقرار ناشی از اشتباه تایپی یا نوع‌های اشتباه مقدار را قبل از رسیدن کد به تولید شناسایی می‌کند.
فیکسچرهای تست QA
از فیکسچرهای JSON تست interface تولید کنید تا assertion های شما با شکل داده مورد انتظار مطابقت داشته باشند. فیلدهای گمشده یا تغییرنام یافته را قبل از اجرای تست‌ها شناسایی کنید.
قراردادهای خط لوله داده
وقتی یک خط لوله خروجی JSON تولید می‌کند، interface های تولیدشده به‌عنوان schema برای مصرف‌کنندگان پایین‌دستی عمل می‌کنند. تغییرات در شکل خروجی خطاهای زمان کامپایل ایجاد می‌کند.
یادگیری TypeScript
دانشجویان و توسعه‌دهندگانی که تازه با TypeScript آشنا می‌شوند می‌توانند ساختارهای JSON آشنا را جایگذاری کنند و ببینند چگونه interface ها به داده نگاشت می‌شوند. این شکاف بین تایپ‌بندی پویا و استاتیک را پر می‌کند.

جدول مرجع نگاشت نوع JSON به TypeScript

هر مقدار JSON به یک نوع TypeScript نگاشت می‌شود. جدول زیر نشان می‌دهد که هر نوع اولیه و ساختاری JSON چگونه ترجمه می‌شود. این نگاشت از استاندارد JSON طبق ECMA-404 و نوع‌های توکار TypeScript پیروی می‌کند.

نوع JSONمقدار نمونهنوع TypeScript
string"hello"string
number42, 3.14number
booleantrue, falseboolean
nullnullnull
object{"key": "value"} nested interface
array[1, 2, 3]number[] (inferred from first element)

interface در مقابل type Alias در TypeScript

TypeScript دو روش برای توصیف شکل اشیاء ارائه می‌دهد: تعریف interface و نام مستعار type. هر دو برای نمایش ساختارهای JSON کار می‌کنند، اما در رفتار گسترش و ادغام متفاوت هستند. اکثر مولدهای JSON به TypeScript interface ها را خروجی می‌دهند زیرا انتخاب متعارف برای شکل اشیاء در TypeScript هستند.

interface
از ادغام تعریف و نحو extends پشتیبانی می‌کند. برای شکل اشیاء، به‌ویژه در API های عمومی و کتابخانه‌ها ترجیح داده می‌شود. می‌توان توسط interface های دیگر گسترش یافت یا با type ها ترکیب شد.
type
از نوع‌های union، نوع‌های intersection و نوع‌های mapped پشتیبانی می‌کند. برای نوع‌های محاسبه‌شده، union های تمایزیافته، یا زمانی که نیاز به نام‌گذاری یک نوع اولیه دارید مناسب‌تر است. نمی‌توان برای ادغام تعریف دوباره باز کرد.

نمونه کد

در زیر نمونه‌هایی از تولید interface های TypeScript از JSON در زبان‌ها و ابزارهای مختلف آمده است. هر قطعه خروجی قابل اجرا تولید می‌کند.

TypeScript
// Manual interface definition from a JSON shape
const json = '{"id": 1, "name": "Alice", "active": true}';
const parsed = JSON.parse(json);

interface User {
  id: number;
  name: string;
  active: boolean;
}

const user: User = parsed;
console.log(user.name); // "Alice" — fully typed
JavaScript (json-to-ts library)
import JsonToTS from 'json-to-ts';

const json = {
  id: 1,
  name: "Alice",
  address: { street: "123 Main St", city: "Springfield" },
  tags: ["admin", "user"]
};

const interfaces = JsonToTS(json, { rootName: "User" });
console.log(interfaces.join("\n\n"));
// interface Address {
//   street: string;
//   city: string;
// }
//
// interface User {
//   id: number;
//   name: string;
//   address: Address;
//   tags: string[];
// }
Python (datamodel-code-generator)
# Install: pip install datamodel-code-generator
# Generate TypeScript-style types from JSON using Pydantic models

# Command line:
# datamodel-codegen --input data.json --output model.py

# Or generate TypeScript directly with quicktype:
# pip install quicktype
# quicktype --lang ts --src data.json --out types.ts

import json

data = {"id": 1, "name": "Alice", "scores": [98, 85, 92]}

# Python equivalent using TypedDict (Python 3.8+)
from typing import TypedDict, List

class User(TypedDict):
    id: int
    name: str
    scores: List[int]

user: User = data  # type-checked by mypy
CLI (quicktype)
# Install quicktype globally
npm install -g quicktype

# Generate TypeScript interfaces from a JSON file
quicktype --lang ts --src data.json --out types.ts

# From a JSON string via stdin
echo '{"id": 1, "name": "Alice"}' | quicktype --lang ts

# Output:
# export interface Root {
#   id:   number;
#   name: string;
# }

سوالات متداول

JSON به TypeScript چگونه با فیلدهای اختیاری برخورد می‌کند؟
اگر مقدار JSON برابر null باشد، مولد ویژگی را با پسوند ? اختیاری علامت‌گذاری می‌کند و نوع null را به آن اختصاص می‌دهد. اگر نیاز دارید بین کلیدهای گمشده و مقادیر null تمایز قائل شوید، می‌توانید خروجی را به‌صورت دستی تنظیم کنید تا برای ویژگی‌های گمشده از undefined استفاده شود.
آیا می‌توانم آرایه‌های JSON را به TypeScript تبدیل کنم؟
بله. اگر JSON اصلی شما یک آرایه باشد، مولد اولین عنصر را بررسی می‌کند تا نوع آیتم را استنتاج کند و یک interface برای آن عنصر خروجی می‌دهد. نوع اصلی آن interface به علاوه [] می‌شود. آرایه‌های خالی unknown[] تولید می‌کنند زیرا هیچ عنصری برای بررسی وجود ندارد.
با اشیاء JSON عمیقاً تودرتو چه اتفاقی می‌افتد؟
هر شیء تودرتو یک interface جداگانه با نام مخصوص تولید می‌کند. نام از کلید ویژگی گرفته شده و به PascalCase تبدیل می‌شود. به‌عنوان مثال، ویژگی با نام "shipping_address" یک interface با نام ShippingAddress تولید می‌کند. این خروجی را حتی برای JSON با چهار یا پنج سطح تودرتو خوانا نگه می‌دارد. اگر چندین شیء تودرتو ساختار یکسانی داشته باشند، ممکن است بخواهید آن‌ها را به‌صورت دستی در یک interface مشترک ادغام کنید تا از تکرار در پایگاه کد خود جلوگیری کنید.
آیا تفاوتی بین json2ts و quicktype وجود دارد؟
json2ts یک مبدل ساده است که مقادیر JSON را مستقیماً به interface های TypeScript نگاشت می‌کند. quicktype با تحلیل چندین نمونه JSON، حذف اشکال مشابه و پشتیبانی از خروجی در بیش از ۲۰ زبان فراتر می‌رود. برای تبدیل‌های یکباره، یک ابزار مبتنی بر مرورگر سریع‌تر است. برای خط لوله‌های CI یا تولید کد چند زبانه، quicktype گزینه بهتری است.
چرا از interface به‌جای type alias برای JSON استفاده کنیم؟
interface ها از ادغام تعریف پشتیبانی می‌کنند، یعنی می‌توانید یک interface تولیدشده را در یک فایل جداگانه بدون تغییر فایل اصلی گسترش دهید. همچنین پیام‌های خطای واضح‌تری در اکثر ویرایشگرها تولید می‌کنند. type alias ها زمانی بهتر هستند که به نوع‌های union یا نوع‌های mapped نیاز دارید، اما برای شکل اشیاء JSON ساده، interface ها انتخاب استاندارد هستند. اگر در حال نوشتن یک کتابخانه یا SDK هستید، interface ها تقریباً همیشه انتخاب درستی هستند زیرا مصرف‌کنندگان پایین‌دستی می‌توانند با ادغام تعریف آن‌ها را بدون لمس کد منبع شما تکمیل کنند.
آیا این ابزار می‌تواند JSON با نوع‌های ناسازگار در آرایه‌ها را پردازش کند؟
مولد نوع عنصر آرایه را از اولین عنصر non-null استنتاج می‌کند. اگر آرایه شما شامل نوع‌های ترکیبی باشد — مثلاً اشیاء ترکیب‌شده با رشته‌ها — خروجی فقط شکل اولین عنصر را منعکس می‌کند. برای آرایه‌های ناهمگون، باید پس از تولید به‌صورت دستی یک نوع آرایه union تعریف کنید، مانند نوعی که هم عناصر Item و هم عناصر string را می‌پذیرد، تا تمام نوع‌های ممکن عنصر را به‌درستی نمایش دهد.
چطور از interface های تولیدشده در یک پروژه واقعی استفاده کنم؟
interface های تولیدشده را در یک فایل .ts در پروژه خود کپی کنید، معمولاً در پوشه types/ یا models/. آن‌ها را در جایی که داده JSON را دریافت یا پردازش می‌کنید وارد کنید. اگر نیاز دارید تضمین کنید که پاسخ‌های API در زمان اجرا با interface مطابقت دارند — نه فقط در زمان کامپایل — آن‌ها را با یک اعتبارسنج زمان اجرا مانند Zod یا io-ts ترکیب کنید. با Zod می‌توانید نوع TypeScript را مستقیماً از schema با استفاده از ابزار infer آن استخراج کنید و از تکرار بین تعریف interface و منطق اعتبارسنجی جلوگیری کنید.
آیا interface های TypeScript تولیدشده ایمنی نوع در زمان اجرا را فراهم می‌کنند؟
خیر — سیستم نوع TypeScript در زمان کامپایل حذف می‌شود. interface ها فقط در ویرایشگر و حین ساخت وجود دارند، نه در زمان اجرا. JSON.parse() همیشه any برمی‌گرداند صرف‌نظر از نوعی که بعداً به آن اختصاص می‌دهید. برای اجبار نوع‌ها در زمان اجرا، interface های تولیدشده را با کتابخانه‌ای مانند Zod یا io-ts ترکیب کنید. این کتابخانه‌ها اعتبارسنجی می‌کنند که یک شیء ورودی واقعاً با شکل مورد انتظار مطابقت دارد قبل از اینکه از آن استفاده کنید و از پاسخ‌های API ناقص، فیلدهای گمشده و مقادیر null غیرمنتظره محافظت می‌کند.