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

TypeScript / المتوسط / الدرس 9

الأنواع الشرطية وأنواع القوالب النصية

احسب علاقات أنواع مفيدة دون ادعاء تنفيذ تحويلات البيانات أو إثبات نماذج عودية بلا حدود.

وقت القراءة التقريبي: 3 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • قراءة الأنواع الشرطية وinfer والتوزيع.
  • بناء علاقات نصية محدودة بالقوالب.
  • فصل حساب الأنواع عن التحليل والتوليد التنفيذي.

يتفرع النوع الشرطي وفق قابلية الإسناد

يختار T extends U ? A : B نوعًا بالإسناد لا شرطًا تنفيذيًا. يختصر علاقات بدل تحميل زائد مكرر. يتوزع الشرط على معامل عارٍ عبر الاتحاد، ويمنع تغليف الجانبين بصفوف التوزيع إذا كان السؤال عن الاتحاد كاملًا. يؤثر ذلك في الاتحادات وnever؛ فاختبر النوع صغيرًا قبل مكتبة عامة. قد يصف التعبير المختصر علاقة خاطئة.

استنتاج نوع مكوّن من بنية مطابقة

تقدم infer متغير نوع داخل النمط. يستخرج المثال عنصر مصفوفة readonly وإلا يحفظ الأصل. يُفحص المتغير بناتج النوع وتُنشئ JavaScript العدد سبعة فقط. لا تفحص ElementOf مصفوفة فعلية. اكتب فحوصًا حقيقية للمصفوفات الخارجية. يفيد الاستخراج لعلاقات واجهات موصوفة بأنواع موثوقة لا لتحويل بيانات اعتباطية إليها.

typescript أنواع ساكنة محسوبة وقيم حرفية عادية
export {};
type ElementOf<T> = T extends readonly (infer Item)[] ? Item : T;
const value: ElementOf<readonly number[]> = 7;
const label: ElementOf<string> = "map";
console.log(value, label);
الناتج المتوقع
7 map

تنتج ElementOf عددًا ونصًا على الترتيب ويطبع التنفيذ القيم المسندة.

توليد أسماء محدودة في الفاحص

تجمع أنواع القوالب أجزاء حرفية إلى نصوص. يسمح المثال بأسماء أحداث مشتقة من حقول معلومة. يوجد النص بإسناده لا بتسجيل مستمع أو رسالة من النوع. قد تضاعف الاتحادات الكبيرة البدائل والكلفة والتشخيص. استخدم مجالًا محدودًا مفيدًا أو ولّد تصريحات كبيرة مسبقًا بدل حساب حاصل ضرب لكل مستهلك. افحص الاسم الخارجي قبل التوجيه.

typescript علاقة نصية محدودة
export {};
type Field = "count" | "title";
type EventName = `${Field}Changed`;
function record(name: EventName): string { return `event:${name}`; }
console.log(record("countChanged"));
console.log(record("titleChanged"));
الناتج المتوقع
event:countChanged
event:titleChanged

ينتمي الاسمان للاتحاد المحسوب وتنسق الدالة نصًا دون أثر لنظام أحداث.

تحديد تعقيد نموذج النوع

تصف الشروط العودية علاقات متداخلة وتخضع لموارد المترجم وحدود الإنشاء. لا تعد بعمق عام دقيق؛ فهو يتبع التعبير والإصدار. تتصرف never كاتحاد فارغ في تعبيرات موزعة وقد تفاجئ توقع الفرع الخاطئ. تختلف unknown وany أيضًا. اختبر الصف الفارغ والاختيار والاتحاد وnever وstring العامة. فضّل مجالًا موثقًا محدودًا على عموم يبدو شاملًا ويصبح غير قابل للاستخدام.

فحص مطابقة التنفيذ للعلاقة المعلنة

قد يصعب تنفيذ إرجاع شرطي عام لأن التدفق لا يثبت ارتباط الفرع بالنتيجة. لا تسد الفجوة بتأكيدات تخفي وعدًا غير مدعوم. استخدم تحميلًا زائدًا بتنفيذ صحيح أو دوال منفصلة أو اتحادًا صادقًا دون حاجة للترابط الدقيق. اجمع اختبار النوع والتنفيذ كي لا يحفظ التعديل أحدهما ويكسر الآخر. تفيد القوة إذا حسنت عقد المستهلك لا لعرض التعقيد.

الأخطاء الشائعة وإصلاحها

توقع إنشاء حدث من اسم نوعي.

لماذا يحدث؟
خُلط حساب الفاحص بالشيفرة التنفيذية.
كيف تصلحه؟
نفّذ التسجيل أو التوجيه صراحة.
كيف تتجنب تكراره؟
وثّق الباقي بعد محو الأنواع.

شرط نوع يتصرف بصورة مفاجئة مع اتحاد.

لماذا يحدث؟
لم يؤخذ التوزيع بالحسبان.
كيف تصلحه؟
اختبر البدائل أو امنع التوزيع عمدًا.
كيف تتجنب تكراره؟
أدرج never والأنواع العامة في الاختبارات.

إبلاغ الفاحص عن عمق إنشاء مفرط.

لماذا يحدث؟
تجاوز حساب عودي حدود المترجم العملية.
كيف تصلحه؟
بسّط النموذج أو حدّه بدل إخفاء الخطأ.
كيف تتجنب تكراره؟
قِس كلفة ترجمة المستهلك قبل نشر التعقيد.

اختبر فهمك

1. احسب ElementOf<string | number[]> وفسّر الآلية وهل تفحص قيمة فعلية.

اعرض الحل المشروح

يتوزع شرط T العاري؛ يبقى string وتعطي المصفوفة number فينتج string | number. لا يحدث فحص أو تحويل تنفيذي. تحتاج unknown فحصًا حقيقيًا. أضف إسنادين نوعيين للبديلين.

2. أضف "enabled" إلى Field وحدّد الاسم المقبول الجديد ومسؤولية تنفيذية باقية.

اعرض الحل المشروح

تدخل enabledChanged في EventName ولا ينشأ معالج أو فحص حمولة أو صلاحية مصدر. يظل التسجيل والتوجيه والتحقق من البيانات فعليًا. اختبر قبول الاسم وفرع تنفيذه معًا.

أهم ما تعلمته

  • تحسب الأنواع الشرطية علاقات الإسناد.
  • تولد القوالب أنواعًا لا خدمات تنفيذ.
  • حدّ التعقيد واختبر عقد التنفيذ أيضًا.

المراجع الرسمية