طريقة الاستخدام
- الصق قيمة JSON نموذجية في عينة JSON. تظهر الأنواع أثناء الكتابة.
- اكتب اسماً تحت اسم الواجهة الجذرية للكائن الخارجي، مثل Product.
- ألغِ تحديد كتابة export قبل كل تعريف إن بقيت الأنواع في الملف نفسه.
- انسخ واجهات TypeScript، أو نزّلها ملفاً باسم types.ts.
كيف تُستخرج الأنواع
يصبح كل كائن JSON واجهة. ويأتي اسمها من المفتاح الذي يحمله، بصيغة PascalCase: المفتاح first-name يعطي FirstName. وعناصر المصفوفة تأخذ صيغة المفرد لمفتاح المصفوفة، فالمفتاح items يعطي Item. وإن كان الاسم مستخدماً من قبل، يُضاف اسم الأب قبله.
تصبح السلاسل والأعداد والقيم المنطقية string وnumber وboolean. ويُكتب null في الاتحاد، مثل number | null. وتصبح المصفوفة من قيم بنوع متبوعاً بـ []، والمصفوفة الفارغة تصبح unknown[] لأن العينة لا تقول ما فيها.
key "first-name" -> property "first-name": string; items -> Item[]
عدة عينات في مصفوفة
تُقرأ قائمة الكائنات كشكل واحد. المفتاح الذي يظهر في كل عنصر إلزامي، والمفتاح الغائب من بعض العناصر يُكتب بعلامة استفهام، أي اختياري. والمفتاح الذي يحمل أنواعاً مختلفة في عناصر مختلفة يصبح اتحاداً، مع string أولاً ثم number وboolean والواجهة والمصفوفة وnull.
تُظهر العينة القيم التي تحتويها فقط. فالمفتاح الذي يغيب أحياناً في واجهات API حقيقية قد يغيب من مثال واحد، لذلك أضف عنصراً ثانياً يحمله إن أردت أن يظهر النوع اختيارياً.
مثال محلول: العينة الافتراضية
العينة الافتراضية كائن واحد فيه خمسة مفاتيح. يحمل المفتاح owner كائناً، لذلك تحتوي الشيفرة على الواجهة Owner. والمفتاح items مصفوفة من كائنين، لذلك تحتوي الشيفرة على الواجهة Item. والمفتاحان sku وprice موجودان في العنصرين، فهما إلزاميان. والمفتاح discount قيمته null في عنصر وعدد في آخر، فنوعه number | null. والمفتاح note يظهر في عنصر واحد فقط، فهو اختياري.
تكون النتيجة ثلاثة تعريفات: Root وOwner وItem، ويظهر العدد 3.
الأسئلة الشائعة
لماذا يُكتب حقل بعلامة استفهام؟
الحقل غائب من كائن واحد على الأقل في العينة. وقد يكون غائباً في البيانات الحقيقية، لذلك تعامله TypeScript كحقل اختياري، ويجب أن يتحقق الكود الذي يقرأه أولاً.
لماذا يظهر حقلي كاتحاد مثل string | number؟
تحمل العناصر المختلفة أنواعاً مختلفة لذلك المفتاح. ويسرد النوع كل نوع رآه في العينة، لذلك يجب على الكود أن يتحقق من النوع الذي يحمله قبل استخدام القيمة.
هل تفحص الأداة بيانات API الحقيقية الخاصة بي؟
لا. تكتب الأداة أنواع العينة التي تلصقها. والعينة ذات العنصر الواحد لا تُظهر حقلاً يظهر لاحقاً فقط، لذلك استخدم استجابة نموذجية فيها عدة عناصر كلما أمكن.
لماذا تُكتب بعض أسماء الخصائص بين علامتي اقتباس؟
يجب أن يوضع الاسم الذي ليس معرّفاً عادياً، مثل first-name أو 2fa، بين علامتي اقتباس في TypeScript. أما الأسماء الصالحة كمعرّفات فتُكتب دون اقتباس.
هل أستطيع استخدام الناتج مع JavaScript؟
الواجهات خاصة بـ TypeScript فقط. وتُزال عند تجميع الشيفرة، لذلك يحتاج مشروع JavaScript إلى فحص JSON بطريقة أخرى، أو إلى خطوة بناء في TypeScript.
المصادر
- TypeScript Handbook (باللغة الإنجليزية): object types, interfaces and optional properties
- RFC 8259 (باللغة الإنجليزية): The JavaScript Object Notation (JSON) Data Interchange Format
آخر مراجعة للأرقام والنص: الثلاثاء، 30 جمادى الأولى 1448 بعد الهجرة.