0Pricing
TypeScript Academy · درس

الواجهات السلسة مع الأنواع

سلسلوا الدوال مع تتبع الحالة المتراكمة في الأنواع

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

تتبّع ما تم تعيينه

يتيح لك المنشئ العادي استدعاء build() في أي وقت، حتى عند غياب الحقول المطلوبة. يمكننا تحسين ذلك من خلال تتبّع الحالة المتراكمة في نظام الأنواع باستخدام معامل نوع عام.

معامل نوع للحالة

نمنح المنشئ نوعًا عامًا S يسجّل المفاتيح التي تم توفيرها حتى الآن. ومع تنفيذ كل دالة، نوسّع S ليشمل مفتاحًا جديدًا.

class Builder<S> {
  // S is a record of keys set so far, e.g. {} or { url: string }
  private data: Record<string, unknown> = {};
}

كل دالة تضيف مفتاحًا

تعيد دالة التعيين منشئًا جديدًا ذا نوع محدد، بحيث يتضمن S المفتاح المضاف حديثًا. تخزّن البيئة وقت التشغيل القيمة، ويتسع النوع بما يتوافق معها.

  set<K extends string, V>(key: K, value: V): Builder<S & Record<K, V>> {
    this.data[key] = value;
    return this as unknown as Builder<S & Record<K, V>>;
  }

حيلة التقاطع

يُجري التعبير S & Record<K, V> تقاطعًا بين الحالة السابقة والمفتاح الجديد. وبعد استدعاءين، يعرف النوع كلا المفتاحين بدقة.

type Empty = {};
type AfterUrl = Empty & Record<"url", string>;
type AfterBoth = AfterUrl & Record<"method", string>;
// AfterBoth = { url: string; method: string }

منشئ طليق فعلي

يمرّر منشئ الطلب هنا شكله المتراكم عبر كل استدعاء. ويعرف المترجم دائمًا الحقول الموجودة بدقة.

class Req<S> {
  private d: Record<string, unknown> = {};
  url(u: string): Req<S & { url: string }> {
    this.d.url = u; return this as any;
  }
  method(m: string): Req<S & { method: string }> {
    this.d.method = m; return this as any;
  }
}

ينمو النوع أثناء التسلسل

ينتج كل استدعاء في التسلسل نوعًا أكثر تحديدًا للمنشئ. وعند تمرير المؤشر فوق النتيجة في المحرر، تظهر الحالة المتراكمة.

const partial = new Req<{}>().url("/x");
// type: Req<{ url: string }>
const full = partial.method("POST");
// type: Req<{ url: string; method: string }>

لماذا نتتبّع الحالة أصلًا؟

عندما يحمل النوع مجموعة المفاتيح التي تم توفيرها، يمكننا تقييد build() لاحقًا بحيث لا يُترجم إلا عند وجود المفاتيح المطلوبة. ويشكّل معامل الحالة الأساس لهذا الضمان.

قراءة الشكل المتراكم

يمكنك استخراج الشكل المتراكم لفحصه. ويؤكد ذلك أن نوع المنشئ يعكس بدقة ما تم إعداده.

type StateOf<T> = T extends Req<infer S> ? S : never;
type S1 = StateOf<Req<{ url: string }>>; // { url: string }

يبقى وقت التشغيل بسيطًا

تكمن كل الحيلة في الأنواع. ففي وقت التشغيل، تخزّن كل دالة تعيين قيمةً في كائن فحسب. وتربط عمليات التحويل (as any) الكائن وقت التشغيل بالنوع الأغنى وقت الترجمة.

const r = new Req<{}>().url("/users").method("GET");
console.log("configured url and method");

الحالة العامة كسجل

فكّر في S على أنه سجل لما تم تعيينه. تضيف الدوال إدخالات، ويمكن لخطوة البناء قراءة السجل لاحقًا لتحديد ما إذا كان الإنشاء مسموحًا.

المفاضلات

يوفّر تتبّع الحالة على مستوى النوع ملاحظات دقيقة في بيئة التطوير المتكاملة ويمنع عمليات البناء غير المكتملة، مقابل استخدام بعض عمليات التحويل والأنواع العامة المتقدمة. وتستحق هذه المقاربة العناء في واجهات البرمجة التي يستخدمها كثيرون.

فحص سريع

فحص سريع لهذا الدرس.

مراجعة

يحمل المنشئ الطليق ذي الأنواع معامل حالة عامًا هو S. وتُجري كل دالة تعيين تقاطعًا بين S والمفتاح الجديد (S & Record<K, V>)، ثم تعيد منشئًا أكثر تحديدًا، مما يمنح المترجم سجلًا دقيقًا بالحقول التي تم إعدادها.

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

هل درس «الواجهات السلسة مع الأنواع» مجاني؟

نعم — نص درس «الواجهات السلسة مع الأنواع» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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. أساسيات نمط Builder
  2. الواجهات السلسة مع الأنواع
  3. فرض الخطوات المطلوبة
  4. Builders غير القابلة للتغيير
← العودة إلى TypeScript Academy