تحويل JSON إلى أنواع Flow — Numio
يُنشئ أسماء أنواع مستعارة (type aliases) في Flow من عيّنة JSON، تبدأ بـ // @flow. يحصل كل كائن متداخل على نوع مُصدَّر خاص به، وتُعلَّم المفاتيح المفقودة من بعض عناصر المصفوفة كاختيارية بـ ?.
تحديد أنواع استجابات API في قاعدة شيفرة React أو React Native لا تزال تستخدم Flow.
JSON
Flow
متى تستخدمها
- تحديد أنواع استجابات API في قاعدة شيفرة React أو React Native لا تزال تستخدم Flow.
- كتابة أنواع لبيانات fixtures أو البيانات الوهمية في مجموعة اختبارات يفحصها Flow.
طريقة الاستخدام
- الصق كائن JSON في المحرر.
- افتح الإعدادات لتغيير prefix (الافتراضي I) وRoot Name (الافتراضي RootObject)؛ يصبح النوع الجذري IRootObject وتحصل الأنواع المتداخلة على البادئة نفسها.
- انسخ الأنواع المُصدَّرة إلى ملف .js يحتفظ بالترويسة // @flow.
إدخال JSON
{
"id": 42,
"name": "Ada Lovelace",
"email": null,
"active": true,
"score": 98.5,
"tags": ["admin", "dev"],
"address": { "city": "London", "postCode": "NW1" }
}أنواع Flow
// @flow
export type IRootObject = {
id: number
name: string
email: null
active: boolean
score: number
tags: string[]
address: IAddress
}
export type IAddress = {
city: string
postCode: string
}التفاصيل والقيود
يعمل في المتصفح بمكتبة json-ts، ويُنسَّق الناتج بـ Prettier؛ ولا يُرفع شيء.
ليس في Flow مساحات أسماء (namespaces)، لذا لا تعرض الصفحة سوى prefix وRoot Name؛ والناتج دائمًا تصريحات export type في المستوى الأعلى.
تُعطى قيم null النوع null والمصفوفات الفارغة any[]. غيّرها إلى أنواع maybe مثل ?string عندما يمكن أن يحمل الحقل قيمة.
يستخدم الناتج أنواع كائنات غير دقيقة (inexact) دون $ReadOnly؛ أضف {| |} أو أغلفة القراءة فقط إذا كان مشروعك يتطلبها.
FAQ
كيف تُكتشف الحقول الاختيارية؟
من مصفوفات الكائنات فقط: المفتاح المفقود من بعض العناصر يصبح اختياريًا، مثل giftWrap?: boolean. مفاتيح المستوى الأعلى ليست اختيارية أبدًا لأن الكائن المفرد لا يملك عيّنة أخرى للمقارنة.
هل يمكنني تحويل مصفوفة JSON في المستوى الجذري؟
نعم. يصبح الجذر اسمًا مستعارًا لمصفوفة مثل export type IRootObject = IRootObjectItem[]، ويدمج نوع العنصر مفاتيح كل العناصر مع تعليم المفاتيح المفقودة كاختيارية.
هل يتعامل مع المصفوفات مختلطة الأنواع؟
نعم، تصبح المصفوفة المسطحة مثل ["a", 2] هي (string | number)[]. وتصبح المصفوفات المتداخلة any[].