TypeScript / المتقدم / الدرس 15
حدود حساب الأنواع ومفاضلات الضمان
افهم حدود نموذج TypeScript المقصودة وقِس تعقيد الأنواع ولا تحول تسهيل الفاحص إلى ضمان تنفيذي غير مدعوم.
في هذه الصفحة
أهداف الدرس
- شرح التوافق البنيوي والسماحات غير المضمونة المقصودة.
- تمييز satisfies والمعلمات والتحقق التنفيذي.
- تحديد النماذج العودية واختبار المستهلك الفعلي.
TypeScript نموذج مفيد بمفاضلات صريحة
صُممت TypeScript للتوافق مع JavaScript ولا تعد بإثبات تام لغياب فشل نوعي في كل مقبول. تحدد البنيوية والتشارك والتصريحات والتأكيدات وany حدودًا للمراجعة، وتقلل الصرامة مخاطر كثيرة دون إزالة كل مفاضلة. يشرح المرجع سماحات منها اختلاف الدوال والأساليب. استخدم النموذج لاتساق قوي ضمن افتراضات وحدّد لقاءها بالخارج والتعديل. لا تنسب أمان التنفيذ الكامل لنجاح الفحص.
قد يلاحظ readonly تعديلًا داخليًا مسموحًا
يعدّل المثال خاصية متداخلة عبر Readonly سطحية فيُقبل لأنها تقيد الحقل الخارجي لا كل المشار إليه. يظهر التعديل دون تأكيد أو تجاوز. يقيد النوع العميق مسارات أكثر ولا يجمد الشبكة أو يضبط كل الأسماء بالضرورة. حدّد هل تعد الواجهة بوصول مقيد أو بيانات ثابتة أو لقطة مستقلة؛ فهي عقود مختلفة تحتاج أدلة مختلفة. لا تستبدل قرار الملكية بتحويل نوع.
export {};
const view: Readonly<{ inner: { count: number } }> = { inner: { count: 3 } };
view.inner.count = 4;
console.log(view.inner.count);
4
تكون inner الخارجية readonly وتبقى count الداخلية قابلة للتعديل.
فحص التوافق دون اختلاق تحويل
تفحص satisfies توافق التعبير وتحفظ معلومات مفيدة تحت السياق، وتختلف عن تأكيد يطلب الثقة. يفحص المثال مجال الوضع ويحفظ safe الحرفية لإسناد آخر. لا يفحص كائنًا خارجيًا أو يجمد الإعداد. للمعلمة وsatisfies والتأكيد أغراض ساكنة مختلفة ولا يستبدل أي منها محلل unknown. استخدم ما تثبته القاعدة فعلًا.
export {};
const configuration = { mode: "safe", retries: 2 } satisfies { mode: "safe" | "fast"; retries: number };
const selected: "safe" = configuration.mode;
console.log(selected, configuration.retries);
safe 2
يطابق الكائن العقد وتبقى mode الحرفية safe هنا، وتأتي الحقول من التعبير الفعلي.
قد تكلف الدقة الظاهرية أكثر من فائدتها
تزيد الشروط العودية والاتحادات والتقاطعات والقوالب الضخمة عمل الفاحص وغموض الخطأ. حدود الإنشاء حواجز عملية لا ميزانية ثابتة لكل تعبير. ضيّق المجال وسمّ الوسائط أو ولّد تصريحات ثابتة كبيرة. قِس مستهلكًا بالإصدار والخيارات نفسها قبل التغيير وبعده. أداء التنفيذ والفاحص منفصلان، وقد يفضل اتحاد أصغر إذا لم يستفد المستهلك من دقة الترابط.
إظهار الافتراضات عند مخارج الفحص
قد ينقل التأكيد أو declare أو any ادعاءً خارج التحقق. قد تحتاج حدود مراجعة ادعاءً ضيقًا بدليل تنفيذي واختبارات، لا علاجًا آليًا للأخطاء. تبطل الاستدعاءات والأسماء المعدلة افتراضًا محليًا. فضّل لقطة أو حالة مغلفة إذا اعتمد async على الثبات. وثّق غير المدعوم واختبر الأمثلة المضادة؛ فالغاية عقد صادق لا دقة تنهار عند أول حد غير مفحوص.
الأخطاء الشائعة وإصلاحها
وصف نجاح strict كإثبات تنفيذي كامل.
- لماذا يحدث؟
- أُهملت مفاضلات النموذج والافتراضات الخارجية.
- كيف تصلحه؟
- اذكر الضمانات وافحص حدود الثقة منفصلة.
- كيف تتجنب تكراره؟
- راجع التصريحات والتشارك والمخارج.
توقع تحليل unknown باستخدام satisfies.
- لماذا يحدث؟
- خُلط التوافق الساكن بالتحليل التنفيذي.
- كيف تصلحه؟
- نفذ محللًا قبل معاملة الإدخال كبيانات مجال.
- كيف تتجنب تكراره؟
- احفظ اختبارات تحقق للمصادر الخارجية.
نوع عام عودي يصبح بطيئًا جدًا.
- لماذا يحدث؟
- ازدادت الدقة دون قياس كلفة المستهلك.
- كيف تصلحه؟
- بسّط النموذج الظاهر أو حدّه.
- كيف تتجنب تكراره؟
- قِس أحمال فحص أنواع ممثلة.
اختبر فهمك
1. قيّد inner الداخلية أيضًا بـReadonly<{count:number}>. ما التغيير وما الذي لا يحدث فعليًا؟
اعرض الحل المشروح
يُرفض تعديل inner.count عبر العرض، ولا يولد تجميد تكراري وقد يعدّل اسم آخر مسموح الكائن. استخدم تجميدًا أو ضبط ملكية عند الحاجة الفعلية واختبره بدل استنتاجه من الاسم.
2. يحسب نوع مكتبة كل مسار من اتحادات هائلة ولا يحتاج المستهلك إلا مجموعة صغيرة موثقة. اقترح عقدًا أبسط.
اعرض الحل المشروح
اعرض الاتحاد المحدود أو بنية صغيرة وافحص المسار الخارجي فعليًا. ولّد التصريحات لقائمة كبيرة معلومة وقارن التشخيص والزمن عند المستهلك. لا تستنتج صحة محلل نصي عام من وصف قوالب كثيرة.
أهم ما تعلمته
- اعرف حدود النموذج وسماحاته.
- تحتاج الدقة الساكنة خصائص فعلية.
- حدّ التعقيد وفق حاجة المستهلك.