الدرس 6 من 10
تغطية كل الحالات
- 13 دقيقة
- 6 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
الحالة المنسية توقف البناء
الشرح
قد يغطّي switch اليوم كل حالات الاتحاد، ثم يضيف زميلك غدًا حالة جديدة فيبتلعها default بصمت، فلا يظهر خطأ ولا تحذير، وتصير رسوم كل دفعة بالمحفظة صفرًا.
المترجم يضيّق النوع مع كل case، فإذا غطّيت الحالات كلها لم يبقَ شيء، وصار نوع القيمة في default هو never، أي النوع الذي لا قيمة له. فإذا مرّرت هذه القيمة إلى دالة لا تقبل إلا never، فإن أي حالة منسية ستبقى في النوع وتصير خطأً عند الترجمة.
والدالة function assertNever(x: never): never تحميك في الوقتين، ففي الترجمة لا تقبل إلا نوعًا لم يبقَ فيه شيء، وفي التشغيل ترمي خطأً إن وصلتها بيانات لم يتوقّعها أحد.
المطلوب
اكتب assertNever بحيث ترمي خطأً، وضعها في default داخل fee بدل return 0. سيتوقّف البناء عندها، فأصلحه بإضافة حالة "wallet" رسومها 1% من amount.
الفحوص
6 فحوص- لا توجد أخطاء في الأنواع
- رسوم المحفظة 1% من المبلغ
- الحالة المجهولة ترمي خطأً ولا تُحسب صفرًا
- الفرع default في fee يستدعي assertNever
- الأمر switch الذي يغطّي كل الحالات يُترجَم مع assertNever
- نسيان حالة واحدة يوقف البناء