تحويل JSON Schema إلى تعريفات TypeScript — Numio
يترجم JSON Schema إلى واجهات TypeScript باستخدام json-schema-to-typescript. تصبح الخصائص غير المدرجة في "required" اختيارية، وتحصل الكائنات على توقيع فهرسة ما لم تكن additionalProperties مساوية لـ false.
تنشر واجهتك البرمجية ملفات JSON Schema وتريد واجهات مطابقة لشيفرة العميل التي تستهلكها.
متى تستخدمها
- تنشر واجهتك البرمجية ملفات JSON Schema وتريد واجهات مطابقة لشيفرة العميل التي تستهلكها.
- لديك ملفات إعداد يُتحقَّق منها بمخطط وتريد فحص الأنواع في الموضع الذي يُحمَّل فيه الإعداد.
طريقة الاستخدام
- الصق JSON Schema في لوحة JSON Schema. يحدد "title" اسم الواجهة؛ وبدونه يُسمّى الجذر MySchema.
- يجري التحويل في المتصفح أثناء الكتابة؛ لا توجد إعدادات في الصفحة ولا يُضاف تعليق ترويسة.
- انسخ الواجهات من لوحة TypeScript. تنسّقها الصفحة باستخدام Prettier، لذا تستخدم إزاحة بمسافتين ولا تحتوي على فواصل منقوطة.
JSON Schema
{
"title": "Address",
"type": "object",
"properties": {
"street": { "type": "string", "minLength": 1 },
"zip": { "type": "string", "pattern": "^[0-9]{5}$" },
"country": { "enum": ["US", "CA"], "default": "US" },
"unit": { "type": ["integer", "null"] },
"lines": { "type": "array", "items": { "type": "string" }, "maxItems": 3 },
"geo": { "type": "object", "required": ["lat", "lng"],
"properties": { "lat": { "type": "number" }, "lng": { "type": "number" } } }
},
"required": ["street", "zip"]
}واجهات TypeScript
export interface Address {
street: string
zip: string
country?: "US" | "CA"
unit?: number | null
lines?: [] | [string] | [string, string] | [string, string, string]
geo?: {
lat: number
lng: number
[k: string]: unknown
}
[k: string]: unknown
}التفاصيل والقيود
الكائنات التي لا تحتوي على "additionalProperties": false تحصل على [k: string]: unknown، فتبقى المفاتيح الإضافية مسموحة في النوع.
يُوسَّع maxItems في المصفوفة إلى اتحاد من الصفوف (tuples)، كما في "lines" في المثال.
تصبح مدخلات $ref المحلية مثل #/definitions/Tag واجهات مُصدَّرة منفصلة.
تمرّر الصفحة النتيجة عبر Prettier دون فواصل منقوطة، ما يزيل أيضًا الأقواس الزائدة حول الاتحادات مثل "US" | "CA".
FAQ
كيف تُحدَّد أنواع قيم null؟
يصبح "type": ["integer", "null"] إلى (number | null). ويُطابَق كل من integer وnumber مع number.
كيف أتخلص من [k: string]: unknown؟
أضف "additionalProperties": false إلى كل مخطط كائن؛ عندها يُحذف توقيع الفهرسة.
كيف تُسمّى الواجهة الجذرية؟
من "title" المخطط بعد تحويله إلى PascalCase (يصبح "Example Schema" إلى ExampleSchema). وبدون title يكون الاسم MySchema.
هل يُرسَل المخطط إلى خادم؟
لا. تعمل الدالة compile من json-schema-to-typescript في المتصفح على هذه الصفحة.