الدرس 3 من 10
اتحاد الأنواع وتضييقها
- 11 دقيقة
- 5 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
قيمة لها أكثر من نوع
الشرح
قد يصلك معرّف المنتج أحيانًا رقمًا مثل 42 وأحيانًا نصًّا مثل "ab12"، والنوع string | number يعبّر عن هذا بالضبط، أي أنّ القيمة من أحد النوعين، ويسمّى هذا الاتحاد (union).
ولا يسمح لك المترجم إلا بما يشترك فيه النوعان، فـid.toUpperCase() خطأ في الأنواع لأنّ الأرقام ليس فيها toUpperCase، وهذا هو الخطأ نفسه الذي يوقف البرنامج في JavaScript حين يصل إلى الدالة رقم.
والحلّ هو التضييق (narrowing)، فداخل if (typeof id === "number") يعرف المترجم أنّ id رقم، وفي الفرع الآخر يعرف أنه نصّ. وانتبه إلى أنّ typeof لا يفرّق بين المصفوفة وnull والكائن، فهي كلها "object".
المطلوب
اجعل نوع مُعامل formatId هو string | number واجعلها تُرجع string، فإن كان نصًّا أرجعته بأحرف كبيرة بعد # مثل "#AB12"، وإن كان رقمًا أكملته بالأصفار إلى أربع خانات مثل "#0042".
الفحوص
5 فحوص- لا توجد أخطاء في الأنواع
- الدالة formatId تقبل نصًّا ورقمًا
- الدالة formatId ترفض أيّ نوع آخر
- ناتج formatId("ab12") هو "#AB12" للنصّ
- ناتج formatId(42) هو "#0042" للرقم