0Pricing
TypeScript Academy · درس

تعريف مُنشئات الأنواع

مثّلوا مُنشئات الأنواع كعمليات بحث في الواجهات

تعريف مُنشئات الأنواع درس مجاني في TypeScript Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في TypeScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة TypeScript Academy 4 دروس في المجموع.

تسمية منشئات الأنواع

يبدأ الترميز بمنح كل منشئ نوع معرّفًا نصيًا فريدًا يسمى URI. وURI هو وسم ينوب عن المنشئ في المواضع التي لا نستطيع فيها تمرير المنشئ نفسه.

type ArrayURI = "Array";
type OptionURI = "Option";
// Each container gets a unique string tag

واجهة سجل

نحتفظ بواجهة واحدة تربط كل URI بالنوع الملموس الذي ينتجه عند إعطائه وسيطًا من النوع A. هذه الواجهة هي السجل. كل مفتاح هو URI، وكل قيمة هي النوع الناتج.

interface URItoKind<A> {
  Array: Array<A>;
  Option: A | null;
}
// URItoKind<number>["Array"] is number[]

البحث عن منشئ

بما أن مفاتيح السجل هي URIs، يصبح تطبيق المنشئ عملية وصول مفهرس. وللحصول على «تطبيق Array على number»، نفهرس السجل.

type ArrayOfNumber = URItoKind<number>["Array"]; // number[]
type OptionOfString = URItoKind<string>["Option"]; // string | null

اتحاد URIS

مجموعة وسوم المنشئات الصالحة ليست إلا مفاتيح السجل. ويعطي keyof URItoKind<unknown> اتحاد جميع URIs المسجّلة، الذي نسمّيه URIS.

type URIS = keyof URItoKind<unknown>; // "Array" | "Option"

توسيع السجل بدمج التصريحات

توفّر TypeScript ميزة قوية: فالواجهات التي تحمل الاسم نفسه تندمج. وتستخدم المكتبات هذه الميزة لكي تضيف كل وحدة حاويتها الخاصة إلى URItoKind من دون تعديل التعريف الأصلي.

interface URItoKind<A> {
  Tree: { value: A; children: Array<A> };
}
// Now URIS also includes "Tree"

الحاويات المعيارية

بفضل الدمج، تسجّل الحاوية المعرّفة في ملف واحد نفسها على مستوى المشروع. ويمكن لأي شخص يستوردها استخدام URI الخاص بها في التجريدات العامة. وهذه هي الطريقة التي تضيف بها fp-ts أنواع Option وEither وTask وغيرها.

// file a.ts
interface URItoKind<A> { Either: { left: A } | { right: A } }
// file b.ts can now reference the "Either" URI

حامل وهمي

لتمرير «أي منشئ» باعتباره نوعًا على مستوى القيم، تحمل النُسخ URI الخاص بها في خاصية، غالبًا ما تكون حقلًا وهميًا. لا يحمل هذا الحقل قيمة فعلية قط؛ بل يسجّل الوسم لنظام الأنواع فحسب.

interface HasURI<F extends URIS> {
  readonly _URI: F;
}
// _URI records which constructor an instance is for

اقتران URI بالوسيط

يحتاج تطبيق المنشئ إلى شيئين: URI وهو F، ونوع الوسيط وهو A. وسنجمع بينهما باستخدام بحث، بحيث تُحلّ (F, A) إلى النوع الملموس عبر السجل.

type Apply<F extends URIS, A> = URItoKind<A>[F];

type A = Apply<"Array", number>;  // number[]
type B = Apply<"Option", string>; // string | null

لماذا نستخدم السلاسل بدلًا من المنشئات

نستخدم السلاسل لأن TypeScript تستطيع تخزينها ومقارنتها كأنواع حرفية، وفهرسة سجل باستخدامها. لا يمكننا تخزين المنشئ Array باعتباره معامل نوع، لكن يمكننا تخزين الحرفية "Array" والبحث عنها.

type Tag = "Array";
type Resolved = URItoKind<boolean>[Tag]; // boolean[]

البحث هو الخطوة الأساسية

يمثّل هذا الوصول المفهرس، URItoKind<A>[F]، جوهر الترميز. فهو يحوّل تطبيق النوع المستحيل F<A> إلى بحث قانوني في السجل. ويصوغ الدرس التالي هذه الفكرة رسميًا على شكل Kind<F, A>.

type Kind<F extends URIS, A> = URItoKind<A>[F];

type X = Kind<"Array", number>; // number[]

مراجعة الإعداد

أصبحت لديكم الآن المكوّنات الأساسية: URIs بوصفها وسومًا، وسجل URItoKind يربط الوسم والوسيط بنوع ملموس، وURIS بوصفه اتحاد الوسوم، ودمج التصريحات لتوسيعه. وتُحاكي فهرسة السجل تطبيق النوع.

// URItoKind = registry, URIS = valid tags,
// URItoKind<A>[F] = "apply constructor F to A"

تحقق سريع

اختبروا مدى فهمكم لترميز السجل.

مراجعة

تعلّمتم ترميز منشئات الأنواع باستخدام السلاسل.

  • يحصل كل منشئ على وسم URI فريد.
  • يربط URItoKind<A> الوسوم بالأنواع الملموسة.
  • يمثّل URIS اتحاد جميع الوسوم باستخدام keyof.
  • يتيح دمج التصريحات للوحدات تسجيل حاويات جديدة.

التالي: تغليف عملية البحث في نمط Kind الخفيف.

الأسئلة الشائعة

هل درس «تعريف مُنشئات الأنواع» مجاني؟

نعم — نص درس «تعريف مُنشئات الأنواع» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة TypeScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة TypeScript Academy 4 دروس في المجموع.

ماذا ستتعلم في «تعريف مُنشئات الأنواع»؟

مثّلوا مُنشئات الأنواع كعمليات بحث في الواجهات تتمرن على TypeScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ TypeScript Academy؟

لا تُشترط خبرة سابقة. TypeScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «تعريف مُنشئات الأنواع»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس TypeScript Academy هذا؟

نعم. كل درس في TypeScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. مشكلة HKT في TypeScript
  2. تعريف مُنشئات الأنواع
  3. نمط HKT خفيف الوزن
  4. Functors وMappers العامة
← العودة إلى TypeScript Academy