البرمجة

تحقق شمولية كتلة التبديل في TypeScript

للتحقق من أن كتلة التبديل (Switch Block) في TypeScript شاملة بشكل كامل، يمكنك استخدام نوع البيانات الفريد في TypeScript المعروف باسم “never”، بالإضافة إلى زيادة نوع البيانات المعتمد على الإستثناء (exhaustive type checking). في الواقع، يمكنك القيام بذلك عن طريق تغيير نوع الإرجاع المتوقع من الدالة إلى “never” بدلاً من “string”.

في الشفرة التالية، سنقوم بتحديد نوع الإرجاع المتوقع للدالة getColorName كـ “never” بدلاً من “string”، وسنستخدم خاصية الإرسال القوية (strict mode) في TypeScript للتأكد من أن الدالة تغطي كل الحالات المحتملة لنوع البيانات المعطى:

typescript
enum Color { Red, Green, Blue } function getColorName(c: Color): never { switch(c) { case Color.Red: return 'red'; case Color.Green: return 'green'; } throw new Error('Did not expect to be here'); }

بتغيير نوع الإرجاع المتوقع للدالة إلى “never”، فإن TypeScript سيقوم بإشعارك بأن هناك حالات لم يتم التعامل معها في كتلة التبديل. وبما أن نوع الإرجاع معلن كـ “never”، فإن أي محاولة لاستخدام قيمة معينة من النوع الممثل بـ “never” ستؤدي إلى رمي استثناء، وهذا يعني أن الدالة لن تنتهي بشكل طبيعي إذا كانت هناك حالة غير معالجة في كتلة التبديل، وبالتالي سيتم رفع خطأ في وقت الترجمة (compile-time error).

باستخدام هذا النهج، يمكنك التأكد من شمولية كتلة التبديل في TypeScript، وتجنب الإغفال في معالجة أي حالات محتملة.

المزيد من المعلومات

بإتقان الاستراتيجية المذكورة للتحقق من شمولية كتلة التبديل في TypeScript، يمكن أن تكون متأكداً من أن تطبيقك سيكون أكثر صلابة وأماناً. لكن هذا ليس الحد الأقصى لما يمكن أن تقدمه TypeScript لضمان جودة الشفرة.

بالإضافة إلى استخدام نوع البيانات “never”، يمكنك استفادة من ميزات TypeScript الأخرى مثل التحقق من الأنماط (pattern matching) والتباعد العميق للنماذج (type narrowing) لتعزيز شمولية كتلة التبديل.

على سبيل المثال، يمكنك استخدام نمط التحقق من الأنماط للتأكد من أن كل حالة محتملة في كتلة التبديل تمثل نوعًا معينًا من البيانات. هذا يضمن أنه لا يمكن استخدام قيم غير متوقعة بينما يتم التعامل مع كتلة التبديل.

لنرى كيف يمكن تطبيق هذه الفكرة على الشفرة السابقة:

typescript
enum Color { Red, Green, Blue } function getColorName(c: Color): string { switch(c) { case Color.Red: return 'red'; case Color.Green: return 'green'; case Color.Blue: return 'blue'; // Handle Blue case explicitly } const exhaustiveCheck: never = c; // يتم الوصول إلى هنا فقط في حالة عدم شمولية كتلة التبديل throw new Error(`Unhandled color: ${exhaustiveCheck}`); }

في هذا المثال، قمنا بتضمين حالة Color.Blue بشكل صريح في كتلة التبديل. هذا يضمن التعامل مع جميع الحالات المحتملة. في حالة نسيان أي حالة، سيؤدي استخدام exhaustiveCheck إلى رفع خطأ في وقت الترجمة.

بالإضافة إلى ذلك، يمكنك استخدام التباعد العميق للنماذج لتضييق نوع البيانات داخل كل حالة. على سبيل المثال، إذا كنت تعرف معرفيًا أن اللون الذي تم تمريره هو “أحمر”، يمكنك استخدام هذه المعلومات لتضييق نوع البيانات داخل الحالة:

typescript
enum Color { Red, Green, Blue } function getColorName(c: Color): string { switch(c) { case Color.Red: return 'red'; case Color.Green: return 'green'; case Color.Blue: return 'blue'; } const exhaustiveCheck: never = c; throw new Error(`Unhandled color: ${exhaustiveCheck}`); }

بهذا الشكل، يمكنك استخدام خصائص TypeScript لضمان أن كتلة التبديل خالية من الفجوات وشاملة بشكل كامل، مما يزيد من جودة وأمان الشفرة الخاصة بك.

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر