الدرس 5 من 10
الاتحادات المميَّزة
- 13 دقيقة
- 5 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
الحالة المستحيلة لا يمكن كتابتها
الشرح
الكائن الواحد الذي يجمع حقلًا اختياريًّا لكل احتمال، مثل { kind: string; radius?: number; width?: number }، يبدو مرنًا، لكنه يقبل دائرة بلا نصف قطر ويُلزمك بكتابة ! كلما قرأت حقلًا، و! مجرّد وعد تعطيه للمترجم ولا يتحقّق منه أحد.
أما الاتحاد المميَّز (discriminated union) فيصف كل حالة وحدها، ويضع في كل منها حقلًا مشتركًا قيمته ثابتة، هكذا: { kind: "circle"; radius: number } | { kind: "rect"; width: number; height: number }، ويكفي أن تفحص kind ليعرف المترجم في أيّ فرع أنت.
فداخل case "circle": يكون shape.radius رقمًا مضمونًا، ويصير shape.width خطأً في الأنواع لأنه غير موجود في الدائرة فعلًا.
المطلوب
أعد تعريف Shape ليكون اتحادًا من { kind: "circle"; radius: number } و{ kind: "rect"; width: number; height: number }، ثم اكتب area باستعمال switch على shape.kind دون أي !.
الفحوص
5 فحوص- لا توجد أخطاء في الأنواع
- مساحة الدائرة صحيحة
- مساحة المستطيل صحيحة
- المترجم يعرف حقول كل فرع
- دائرة بلا radius مرفوضة