الصق حمولة JSON وستحصل في المقابل على واجهات TypeScript — عقود ذات أنواع محددة تصف بدقة الخصائص التي يمتلكها كائن ما ونوع كل خاصية. بدونها، تصل البيانات القادمة من JSON.parse() بنوع any، مما يحرمك من مساعدة المحرر وفحوصات المُصرِّف عند الوصول إلى الخصائص أو تعيينها. يمنحك تحويل JSON إلى TypeScript تلك السلامة دون الحاجة إلى كتابة الواجهات يدويًا.
يغطي TypeScript جميع أنواع قيم JSON الستة: string وnumber وboolean وnull وobject وarray. كل كائن JSON متداخل يتحول إلى واجهة مسماة مستقلة. تُستنتج أنواع المصفوفات من عنصرها الأول. تطابق النتيجة ما يعيده JSON.parse() فعليًا في وقت التشغيل، لذا تعكس الواجهات بيانات حقيقية لا تخمينات.
كتابة الواجهات يدويًا لـJSON كبير أو متداخل بعمق مهمة مضنية وعرضة للأخطاء. يقرأ مولّد JSON إلى TypeScript البنية تلقائيًا، ويتعامل مع التداخل بشكل تكراري، ويُخرج كود الواجهات النظيف في ثوانٍ. يكون هذا مفيدًا بشكل خاص عند التعامل مع واجهة API غير مألوفة، أو النمذجة ببيانات تجريبية، أو ترحيل قاعدة كود JavaScript إلى TypeScript. كما يعفيك من تتبع أسماء الخصائص المتداخلة وأنواعها يدويًا، حتى تركز على منطق التطبيق بدلًا من نماذج الأنواع المتكررة.
لماذا تستخدم مولّد JSON إلى TypeScript؟
توليد واجهات TypeScript يدويًا أمر عملي للكائنات الصغيرة، لكنه يتعقد سريعًا مع البنى المتداخلة أو استجابات API الكبيرة. تخيّل استجابة API تحتوي على 50 حقلًا بثلاثة مستويات من التداخل — كتابتها يدويًا تعني عشرات الواجهات، كل منها مصدر محتمل لأخطاء إملائية أو حقول قابلة للإلغاء مفقودة. يُنتج المولّد الآلي المجموعة الكاملة في ثوانٍ ويقلل احتمال عدم تطابق الأنواع بين كودك والبيانات التي يستهلكها. وما هو أبعد من الدقة، فهو يُبقي أنواعك متزامنة مع عقد الـAPI الفعلي. عندما تغيّر خدمة ما شكل استجابتها، الصق JSON المحدَّث وأعِد التوليد — أسرع بكثير من البحث عن كل خاصية تغيّرت في ملف واجهة مكتوب يدويًا.
⚡
توليد الواجهات فورًا
الصق أي حمولة JSON واحصل على واجهات ذات أنواع صحيحة في ثوانٍ. بدون إعداد مسبق، ولا خطوة بناء مطلوبة.
🔒
حافظ على خصوصية بياناتك
يعمل التحويل بالكامل في متصفحك. لا يغادر JSON لديك جهازك، وهذا مهم عند العمل ببيانات الإنتاج أو استجابات الـAPI الداخلية.
📋
التعامل مع البنى المتداخلة تلقائيًا
تُنتج الكائنات المتداخلة واجهات مسماة منفصلة. تُحلَّل المصفوفات والحقول القابلة للإلغاء والأنواع المختلطة جميعها دون تدخل يدوي.
🌐
بدون حساب أو تثبيت
يعمل في أي متصفح حديث. بدون حزم npm للتثبيت، ولا أدوات CLI للإعداد، ولا نماذج تسجيل للملء.
حالات استخدام تحويل JSON إلى TypeScript
تكامل واجهات API في الواجهة الأمامية
الصق استجابة JSON من REST أو GraphQL لتوليد واجهات لمكونات React وAngular وVue. الخصائص والحالة ذات الأنواع الآمنة تمنع المفاجآت في وقت التشغيل. يمكنك أيضًا مشاركة الواجهات المولّدة بين الواجهة الأمامية والخلفية في monorepo حتى يتفق الجانبان على شكل البيانات ذاته.
تحديد أنواع استجابات الواجهة الخلفية
تستفيد خدمات Node.js وDeno التي تستهلك واجهات API خارجية من الواجهات المولّدة. عرِّف العقد مرة واحدة، والتقط عدم تطابق الشكل في وقت التصريف. الواجهات المولّدة هي أيضًا توثيق خفيف لمستهلكي الخدمة، مما يقلل الحاجة إلى ملفات مخطط منفصلة أو صفحات ويكي.
ملفات إعداد DevOps
تستخدم أدوات البنية التحتية مثل AWS CDK وPulumi إعدادات JSON. ولّد أنواع TypeScript لتلك الإعدادات للتحقق من صحتها قبل النشر. هذا يكتشف عمليات النشر الخاطئة الناجمة عن أخطاء إملائية أو أنواع قيم غير صحيحة قبل وصول الكود إلى الإنتاج.
بيانات اختبار ضمان الجودة
ولّد واجهات من بيانات اختبار JSON حتى تتطابق تأكيداتك مع شكل البيانات المتوقع. اكتشف الحقول المفقودة أو المُعاد تسميتها قبل تشغيل الاختبارات.
عقود أنابيب البيانات
عندما يُنتج أنبوب بيانات مخرجات JSON، تعمل الواجهات المولّدة كمخطط للمراحل اللاحقة من الأنبوب. تؤدي التغييرات في شكل المخرجات إلى أخطاء في وقت التصريف.
تعلّم TypeScript
يستطيع الطلاب والمطورون الجدد على TypeScript لصق بنى JSON مألوفة ومشاهدة كيف تتعيّن الواجهات على البيانات. يعمل على ردم الفجوة بين الكتابة الديناميكية والكتابة الساكنة.
مرجع تعيين أنواع JSON إلى TypeScript
كل قيمة JSON تتعيّن على نوع TypeScript. يوضح الجدول أدناه كيف يُترجم كل نوع JSON أساسي وبنيوي. يتبع هذا التعيين معيار JSON وفق ECMA-404 والأنواع المدمجة في TypeScript.
نوع JSON
مثال على القيمة
نوع TypeScript
string
"hello"
string
number
42, 3.14
number
boolean
true, false
boolean
null
null
null
object
{"key": "value"}
nested interface
array
[1, 2, 3]
number[] (inferred from first element)
interface مقابل type في TypeScript
يقدم TypeScript طريقتين لوصف أشكال الكائنات: تعريفات interface وأسماء type المستعارة. كلاهما يعمل لتمثيل بنى JSON، لكنهما يختلفان في سلوك التوسيع والدمج. تُخرج معظم مولّدات JSON إلى TypeScript واجهات لأنها الخيار المعتاد لأشكال الكائنات في TypeScript.
interface
تدعم دمج التعريفات وصياغة extends. مفضلة لأشكال الكائنات، لا سيما في واجهات API العامة والمكتبات. يمكن توسيعها بواجهات أخرى أو تقاطعها مع الأنواع.
type
تدعم أنواع الاتحاد وأنواع التقاطع والأنواع المعيّنة. أنسب للأنواع المحسوبة والاتحادات المميزة أو عند الحاجة إلى تسمية مستعارة لنوع أساسي. لا يمكن إعادة فتحها لدمج التعريفات.
أمثلة برمجية
فيما يلي أمثلة على توليد واجهات TypeScript من JSON بلغات وأدوات مختلفة. كل مقتطف يُنتج مخرجات قابلة للتشغيل.
كيف يتعامل مولّد JSON إلى TypeScript مع الحقول الاختيارية؟
إذا كانت قيمة JSON تساوي null، يضع المولّد لاحقة ? على الخاصية ويُعيّن لها النوع null. إذا أردت التمييز بين المفاتيح الغائبة وقيم null، يمكنك تعديل المخرجات يدويًا لاستخدام undefined للخصائص المفقودة.
هل يمكن تحويل مصفوفات JSON إلى TypeScript؟
نعم. إذا كان JSON الجذري مصفوفة، يفحص المولّد العنصر الأول لاستنتاج نوع العنصر ويُخرج واجهة له. يصبح النوع الجذري تلك الواجهة متبوعة بـ[]. تُنتج المصفوفات الفارغة unknown[] إذ لا يوجد عنصر للفحص.
ماذا يحدث مع كائنات JSON المتداخلة بعمق؟
كل كائن متداخل يولّد واجهة مسماة مستقلة. يُشتق الاسم من مفتاح الخاصية مُحوَّلًا إلى صيغة PascalCase. فمثلًا، خاصية باسم "shipping_address" تُنتج واجهة باسم ShippingAddress. هذا يُبقي المخرجات مقروءة حتى مع JSON ذي أربعة أو خمسة مستويات من التداخل. إذا تشارك عدة كائنات متداخلة البنية ذاتها، قد ترغب في دمجها يدويًا في واجهة مشتركة واحدة للحد من التكرار في قاعدة كودك.
هل ثمة فرق بين json2ts وquicktype؟
json2ts محوّل بسيط يُعيّن قيم JSON مباشرةً إلى واجهات TypeScript. يذهب quicktype أبعد من ذلك بتحليل عينات JSON متعددة وإزالة تكرار الأشكال المتشابهة ودعم المخرجات بأكثر من 20 لغة. للتحويلات الفردية، أداة المتصفح أسرع. لأنابيب CI أو توليد الكود بلغات متعددة، quicktype هو الخيار الأنسب.
لماذا تُستخدم الواجهات بدلًا من أسماء النوع المستعارة لـJSON؟
تدعم الواجهات دمج التعريفات، مما يعني إمكانية توسيع واجهة مولّدة في ملف منفصل دون تعديل الأصل. كما تُنتج رسائل خطأ أوضح في معظم المحررات. أسماء النوع المستعارة أفضل عند الحاجة إلى أنواع الاتحاد أو الأنواع المعيّنة، لكن لأشكال كائنات JSON المباشرة، الواجهات هي الخيار المعتمد. إذا كنت تؤلف مكتبة أو SDK، فالواجهات هي الخيار الصحيح في الغالب لأن المستهلكين في المراحل اللاحقة يمكنهم توسيعها بدمج التعريفات دون المساس بمصدرك.
هل تتعامل هذه الأداة مع JSON الذي يحتوي على أنواع متضاربة في المصفوفات؟
يستنتج المولّد نوع عنصر المصفوفة من أول عنصر غير null. إذا كانت مصفوفتك تحتوي على أنواع مختلطة — كائنات ممزوجة بنصوص مثلًا — فإن المخرجات تعكس شكل العنصر الأول فقط. للمصفوفات غير المتجانسة، تحتاج إلى تعريف نوع مصفوفة اتحادي يدويًا بعد التوليد، كنوع يقبل كلًا من عناصر Item والنصوص، لتمثيل جميع أنواع العناصر الممكنة بدقة.
كيف أستخدم الواجهات المولّدة في مشروع حقيقي؟
انسخ الواجهات المولّدة إلى ملف .ts في مشروعك، عادةً في مجلد types/ أو models/. استوردها حيث تجلب بيانات JSON أو تعالجها. اقرنها بمُحقِّق وقت تشغيل مثل Zod أو io-ts إذا أردت ضمان تطابق استجابات الـAPI مع الواجهة في وقت التشغيل لا في وقت التصريف فحسب. مع Zod، يمكنك اشتقاق نوع TypeScript مباشرةً من المخطط باستخدام أداة infer المدمجة، مما يزيل التكرار بين تعريف واجهتك ومنطق التحقق.
هل توفر واجهات TypeScript المولّدة سلامة الأنواع في وقت التشغيل؟
لا — نظام أنواع TypeScript يُمحى عند التصريف. الواجهات موجودة فقط في محررك وأثناء البناء، لا في وقت التشغيل. يُعيد JSON.parse() دائمًا any بصرف النظر عن النوع الذي تُعيّنه بعد ذلك. لفرض الأنواع في وقت التشغيل، اقرن واجهاتك المولّدة بمكتبة مثل Zod أو io-ts. تتحقق هذه المكتبات من أن الكائن الوارد يطابق الشكل المتوقع فعليًا قبل استخدامه، مما يحميك من استجابات الـAPI الخاطئة والحقول المفقودة وقيم null غير المتوقعة.