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

تحويل JSON إلى أنواع io-ts — Numio

يُنشئ codecs وقت التشغيل لـ io-ts من عيّنة JSON، مسبوقة بـ import * as t from "io-ts". تصبح الكائنات المتداخلة codecs مستقلة تُعرَّف قبل الـ codecs التي تستخدمها؛ وتذهب المفاتيح المفقودة من بعض عناصر المصفوفة إلى t.partial.

التحقق من استجابة API وقت التشغيل في تطبيق TypeScript مبني على fp-ts وio-ts.

JSON

IO TS

متى تستخدمها

  • التحقق من استجابة API وقت التشغيل في تطبيق TypeScript مبني على fp-ts وio-ts.
  • صياغة codecs أولية لملف إعدادات JSON يجب فحصه قبل الاستخدام.

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

  1. الصق كائن JSON؛ وأدرج عدة عناصر مصفوفة إذا كانت بعض المفاتيح اختيارية.
  2. اقرأ الـ codecs المُنشأة: اسم الجذر RootInterface، وتُسمّى المتداخلة بحسب مفاتيحها (يصبح settings هو Settings).
  3. انسخ الشيفرة، وصدّر الـ codecs التي تحتاجها، واشتق الأنواع باستخدام t.TypeOf.

إدخال JSON

{
  "id": "u_1",
  "name": "Ada",
  "age": 36,
  "nickname": null,
  "settings": { "theme": "dark", "fontSize": 14 },
  "posts": [
    { "title": "Notes", "draft": true },
    { "title": "Engine" }
  ]
}

io-ts codecs

import * as t from "io-ts"

const Settings = t.type({
  theme: t.string,
  fontSize: t.number,
})

const Posts = t.intersection([
  t.type({
    title: t.string,
  }),
  t.partial({
    draft: t.boolean,
  }),
])

const RootInterface = t.type({
  id: t.string,
  name: t.string,
  age: t.number,
  nickname: t.null,
  settings: Settings,
  posts: t.array(Posts),
})

التفاصيل والقيود

يُنشأ في المتصفح بمولّد الموقع الخاص ويُنسَّق بـ Prettier؛ لا توجد إعدادات في الصفحة ولا تُرسل أي طلب إلى الخادم.

تُخرَج الـ codecs بدءًا بالاعتماديات، فيكون كل const معرّفًا قبل أن يشير إليه RootInterface.

تصبح الأرقام t.number (الصحيحة والعشرية على حد سواء). تعطي null النوع t.null، أو t.union([X, t.null]) عندما يكون للعيّنات الأخرى قيمة؛ وتعطي المصفوفات الفارغة t.array(t.unknown).

تذهب المفاتيح المفقودة من بعض عناصر المصفوفة إلى t.partial، وتُجمع مع المفاتيح الإلزامية عبر t.intersection.

FAQ

هل يُنشئ أنواع TypeScript أيضًا؟

ليس مباشرة. أضف type Root = t.TypeOf<typeof RootInterface> لاشتقاق النوع الثابت من كل codec.

كيف تُعامَل الحقول الاختيارية أو القابلة لـ null؟

يوضع المفتاح المفقود من بعض عناصر المصفوفة في t.partial؛ ويصبح المفتاح الذي قيمته null في بعض العناصر t.union([type, t.null]). مفاتيح المستوى الأعلى في الكائن المفرد إلزامية دائمًا.

ماذا يحدث لمصفوفة JSON في المستوى الجذري؟

تُدمج العناصر في codec واحد هو RootInterface لشكل العنصر، ويُضاف const RootInterfaceList = t.array(RootInterface) للمصفوفة كاملة.

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