انتقل إلى المحتوى

تحويل JSON إلى أنواع Flow — Numio

يُنشئ أسماء أنواع مستعارة (type aliases) في Flow من عيّنة JSON، تبدأ بـ // @flow. يحصل كل كائن متداخل على نوع مُصدَّر خاص به، وتُعلَّم المفاتيح المفقودة من بعض عناصر المصفوفة كاختيارية بـ ?.

تحديد أنواع استجابات API في قاعدة شيفرة React أو React Native لا تزال تستخدم Flow.

JSON

Flow

متى تستخدمها

  • تحديد أنواع استجابات API في قاعدة شيفرة React أو React Native لا تزال تستخدم Flow.
  • كتابة أنواع لبيانات fixtures أو البيانات الوهمية في مجموعة اختبارات يفحصها Flow.

طريقة الاستخدام

  1. الصق كائن JSON في المحرر.
  2. افتح الإعدادات لتغيير prefix (الافتراضي I) وRoot Name (الافتراضي RootObject)؛ يصبح النوع الجذري IRootObject وتحصل الأنواع المتداخلة على البادئة نفسها.
  3. انسخ الأنواع المُصدَّرة إلى ملف .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[].

المواصفات والمراجع