النوع 'never'
جزء من قسم مقدمة إلى TypeScript في رحلة JavaScript على Coddy. الدرس 70 من 73.
يمثل النوع never القيم التي لا تحدث أبداً. قد يبدو هذا محيراً في البداية، ولكنه في الواقع منطقي تماماً عندما تفكر في سيناريوهات معينة في التعليمات البرمجية الخاصة بك.
يُستخدم النوع never بشكل شائع للدوال التي لا تعود أبداً بشكل طبيعي.
يتضمن ذلك الدوال التي تطرح خطأً دائمًا أو تحتوي على حلقات تكرار لا نهائية:
function throwError(message: string): never {
throw new Error(message);
}
function infiniteLoop(): never {
while (true) {
// هذه الحلقة لا تنتهي أبدًا
}
}على عكس void، الذي يشير إلى أن الدالة لا تعيد قيمة ذات معنى، فإن never يشير إلى أن الدالة لا تصل أبداً إلى نقطة نهايتها على الإطلاق. يتوقف التنفيذ إما بسبب رمي خطأ أو يستمر إلى ما لا نهاية.
التحدي
سهلقم بإنشاء دالة باسم throwError توضح نوع الإرجاع never من خلال رمي خطأ (error) دائماً وعدم العودة بشكل طبيعي أبداً.
يجب أن تقوم الدالة بما يلي:
- تأخذ معامل
messageمن نوعstring - ترمي
Errorجديداً مع الرسالة المقدمة - يكون لها نوع إرجاع صريح هو
never
قم بإنشاء دالة ثانية باسم handleOperation تقوم بما يلي:
- تأخذ معاملين:
operationمن نوعstringوvalueمن نوعnumber - تعيد
value * 2إذا كانت العملية هي"double" - تعيد
value / 2إذا كانت العملية هي"half" - تستدعي
throwErrorمع الرسالة"Invalid operation: [operation]"لأي عملية أخرى - يكون لها نوع إرجاع صريح هو
number
اختبر دوالك بالعمليات التالية:
- استدعِ
handleOperation("double", 5)واطبع النتيجة - استدعِ
handleOperation("half", 8)واطبع النتيجة - استدعِ
handleOperation("triple", 3)واطبع النتيجة (سيؤدي هذا إلى رمي خطأ)
قم بإنشاء حالات اختبار إضافية:
- استدعِ
handleOperation("double", 15)واطبع النتيجة - استدعِ
handleOperation("half", 20)واطبع النتيجة
جرّب بنفسك
// TODO: اكتب كودك هنا
// never مع نوع إرجاع throwError قم بإنشاء دالة
// number مع نوع إرجاع handleOperation قم بإنشاء دالة
// try-catch اختبر الدوال باستخدام كتل
try {
console.log(handleOperation("double", 5));
} catch (error) {
console.log(`Error: ${(error as Error).message}`);
}
try {
console.log(handleOperation("half", 8));
} catch (error) {
console.log(`Error: ${(error as Error).message}`);
}
try {
console.log(handleOperation("triple", 3));
} catch (error) {
console.log(`Error: ${(error as Error).message}`);
}
try {
console.log(handleOperation("double", 15));
} catch (error) {
console.log(`Error: ${(error as Error).message}`);
}
try {
console.log(handleOperation("half", 20));
} catch (error) {
console.log(`Error: ${(error as Error).message}`);
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس مقدمة إلى TypeScript
1البداية مع TS
ما هي TypeScript؟لماذا نستخدم TypeScript؟أول كود TypeScript لكعملية الـ Compilation والأخطاءملخص: مقدمة في TS4التعامل مع الدوال
تحديد أنواع المعاملات وقيم الإرجاعتحديد أنواع Arrow Functionsنوع الإرجاع 'void'المعاملات الاختيارية باستخدام '?'القيم الافتراضية للمعاملاتتحديد أنواع Rest Parametersتعريف أنواع الدوالملخص: بناء دوال محددة الأنواع2الأنواع الأساسية
الأنواع الأساسية: str, num, booleanالنوع 'any': مخرج الهروبالنوع 'unknown'التعامل مع 'null' و 'undef'استنتاج الأنواع في التطبيق العمليتوضيحات الأنواع الصريحةمراجعة: تدريب على الأنواع الأساسية5الأنواع: الأسماء المستعارة، الاتحادات والتقاطعات
الأسماء المستعارة للأنواع الأساسية (Primitives)أنواع الاتحاد ('|')التعامل مع أنواع الاتحادالأنواع الحرفية (Literal Types)أنواع التقاطع ('&')دمج الأسماء المستعارة للأنواعملخص: تركيبات الأنواع المتقدمة3هياكل البيانات: المصفوفات و Tuple
المصفوفات محددة النوع (Typed Arrays)معدل 'readonly' للمصفوفاتما هو الـ Tuple؟تعريف والوصول إلى الـ Tuplesتفكيك الـ Tuples (Destructuring)الـ Tuples للقراءة فقط (Readonly)المصفوفات محددة النوع متعددة الأبعاداستخدام Spread Operator مع المصفوفاتملخص: المصفوفات و Tuples6تحديد أنواع الكائنات والواجهات
توصيف أنواع الكائنات المضمنة (Inline)الأسماء المستعارة للأنواع (Type Aliases) للكائناتمقدمة عن الواجهات (Interfaces)الواجهات (Interfaces) مقابل الأسماء المستعارة للأنواع (Type Aliases)الخصائص الاختيارية وخصائص القراءة فقط (Readonly)توسيع الواجهات والأنواعإضافة الدوال (Methods) إلى الواجهاتملخص: تحديد هياكل الكائناتتدرّب بنفسك: مترجم JavaScript عبر الإنترنت