تحويل TypeScript إلى JSON Schema — Numio
يُنشئ JSON Schema بإصدار draft-07 من أنواع TypeScript باستخدام ts-json-schema-generator. يوضع كل نوع ضمن "definitions"؛ وتُستبعد الخصائص الاختيارية من "required"، وتحصل الكائنات على "additionalProperties": false.
أنواع الطلبات والاستجابات لديك واجهات TypeScript وتحتاج إلى JSON Schema للتحقق عبر Ajv أو لبوابة API.
TypeScript
متى تستخدمها
- أنواع الطلبات والاستجابات لديك واجهات TypeScript وتحتاج إلى JSON Schema للتحقق عبر Ajv أو لبوابة API.
- تريد نشر مخطط لملف إعداد JSON معرَّف شكله مسبقًا كنوع TypeScript.
طريقة الاستخدام
- الصق واجهات TypeScript أو أسماء أنواع مستعارة. تُقرأ وسوم JSDoc مثل @minimum أو @format أو @pattern إلى المخطط.
- تُرسَل الشيفرة المصدرية إلى /api/typescript-to-json-schema، وتُكتب في ملف مؤقت على الخادم، وتُعالَج مع كشف جميع الأنواع.
- انسخ JSON Schema. إذا لم تحتوِ المدخلات إلا على نوع واحد، يحصل الجذر أيضًا على $ref يشير إليه.
TypeScript
/** A product in the catalog */
export interface Product {
/** @minimum 0 */
price: number;
name: string;
tags?: string[];
}JSON Schema (draft-07)
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$ref": "#/definitions/Product",
"definitions": {
"Product": {
"type": "object",
"properties": {
"price": {
"type": "number",
"minimum": 0
},
"name": {
"type": "string"
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"price",
"name"
…التفاصيل والقيود
ترسل الصفحة مدخلاتك إلى مسار على الخادم (/api/typescript-to-json-schema) لتحويلها؛ فهي لا تُعالَج في المتصفح فقط. تقبل مسارات API في Next.js افتراضيًا أجسام طلبات حتى 1 ميغابايت.
يُحلَّل JSDoc في الوضع الموسَّع: يصبح تعليق الوصف "description"، وتصبح الوسوم مثل @minimum 0 أو @minLength 1 كلمات مفتاحية.
تُتخطّى التوابع في الواجهات. يصبح Date سلسلة string مع format date-time، وتصبح اتحادات القيم الحرفية enum.
bigint غير مدعوم ويعيد خطأ "Unknown node". يُوصف Map وSet بواجهتيهما، أي كائن لا يحتوي إلا على size رقمي، لذا استخدم Record<string, T> أو المصفوفات لبيانات JSON.
FAQ
هل تُضمَّن الأنواع غير المُصدَّرة؟
نعم. يُضاف كل نوع في المدخلات، مُصدَّرًا كان أم لا، إلى "definitions"، وتستخدم المراجع بينها $ref.
كيف تُمثَّل الخصائص الاختيارية والقابلة لـ null؟
تُستبعد الخصائص الاختيارية من "required". ويصبح الاتحاد مع null إلى anyOf مع {"type": "null"}.
لماذا يوجد $ref في الجذر؟
عند وجود نوع واحد يجعل المولِّد الجذر يشير إليه عبر $ref. وعند وجود عدة أنواع لا يُخرَج إلا "definitions".