نوع never والحالات المستحيلة
نمذجوا التعليمات البرمجية غير القابلة للوصول والقيم المستحيلة باستخدام never
نوع never والحالات المستحيلة درس مجاني في TypeScript Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في TypeScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة TypeScript Academy 4 دروس في المجموع.
نوع never
يمثل never النوع الفارغ — أي القيم التي يستحيل حدوثها. لا يمكن إسناد أي قيمة إلى never (باستثناء never نفسه). ويشير إلى الحالات التي ينبغي أن تكون مستحيلة.
// You cannot create a value of type never
function crash(): never {
throw new Error('boom');
}
try { crash(); } catch (e) { console.log('caught'); }الدوال التي لا تعيد قيمة أبدًا
الدالة التي تنفذ throw دائمًا لا تعيد قيمة بصورة طبيعية، ولذلك يكون نوع إعادتها never. وهذا يخبر المستدعين (والمترجم) بأن التنفيذ يتوقف هنا.
function fail(message: string): never {
throw new Error(message);
}
try { fail('invalid'); } catch (e) { console.log('handled'); }الحلقات اللانهائية تعيد never
الدالة التي تحتوي على حلقة لا نهائية لا تعيد قيمة أيضًا، ولذلك تُحدَّد كذلك بالنوع never. يتعرف المترجم على أن تدفق التحكم لا يمكنه الاستمرار بعدها.
function listen(): never {
while (true) {
// forever
break; // (break added so the demo terminates)
}
throw new Error('stopped');
}
console.log('listen has return type never');never في مقابل void
لا تخلط بين never وvoid. فالدالة من نوع void تعيد قيمة (لكنها لا تنتج قيمة مفيدة). أما الدالة من نوع never فلا تعيد قيمة إطلاقًا — إذ ترمي استثناءً أو تدور إلى الأبد.
function logIt(): void {
console.log('done'); // returns normally
}
function abort(): never {
throw new Error('stop'); // never returns
}
logIt();
try { abort(); } catch (e) { console.log('ok'); }never في فحوصات الشمولية
الاستخدام العملي الأهم لـnever هو فحص الشمولية. في الفرع الافتراضي من switch، أسند المتغير إلى never. إذا عولجت جميع الحالات، فسيكون المتغير أصلًا من النوع never، وستتم الترجمة بنجاح.
type Shape = 'circle' | 'square';
function area(s: Shape): string {
switch (s) {
case 'circle': return 'pi r^2';
case 'square': return 'a^2';
default:
const _check: never = s; // ok: all handled
return _check;
}
}
console.log(area('square'));اكتشاف الحالات المفقودة
إذا أضاف أحدهم عضوًا جديدًا إلى الاتحاد ونسي إحدى الحالات، فلن تكون القيمة المتبقية من النوع never، ولذلك سيفشل الإسناد أثناء الترجمة. يحوّل فحص never الفجوة الصامتة إلى خطأ واضح.
type Shape = 'circle' | 'square' | 'triangle';
// If 'triangle' case is missing, assigning s to never
// would error: 'triangle' is not assignable to never.
console.log('Add a case for every member');never في فروع الاتحاد المستحيلة
عندما يزيل التضييق كل الاحتمالات، يصبح النوع المتبقي never. ويعرف المترجم أن هذا الفرع لا يمكن الوصول إليه، مما قد يكشف أخطاء منطقية.
function check(x: string | number): void {
if (typeof x === 'string') {
console.log('string');
} else if (typeof x === 'number') {
console.log('number');
} else {
// x is never here
console.log('unreachable');
}
}
check('hi');never كنوع سفلي
يمثل never النوع السفلي: يمكن إسناده إلى كل نوع آخر، لأن القيمة التي لا يمكن أن توجد متوافقة تلقائيًا مع أي شيء. ولهذا يمكن أن يظهر throw في موضع أي تعبير.
function getOrThrow(v: string | null): string {
return v ?? fail();
}
function fail(): never {
throw new Error('missing');
}
console.log(getOrThrow('value'));تصفية الاتحادات إلى never
في الأنواع الشرطية والأنواع المعتمدة على التعيين، يعمل never بمعنى «أزل هذا». لا يغير الاتحاد مع never شيئًا: فـT | never هو ببساطة T. لذلك فهو الخيار الطبيعي للتصفية.
type Keep<T> = T extends string ? T : never;
type R = Keep<'a' | 1 | 'b'>; // 'a' | 'b'
const x: R = 'a';
console.log(x);نمذجة الحالات المستحيلة
استخدم never في بنيات الكائنات لجعل التركيبات غير القانونية غير قابلة للتمثيل. في هذه الحالة، لا يمكن لحالة «التحميل» أن تحمل بيانات أيضًا، لأن النوع يمنع ذلك.
type State =
| { status: 'loading'; data?: never }
| { status: 'ready'; data: number };
const s: State = { status: 'ready', data: 7 };
console.log(s);never يعزز أمان إعادة الهيكلة
بما أن فحوصات شمولية never تفشل عند فقدان حالة، فإنها تجعل إعادة الهيكلة أكثر أمانًا: وسّع الاتحاد، وسيشير المترجم إلى كل موضع يحتاج إلى تحديث.
type Cmd = 'start' | 'stop';
function run(c: Cmd): string {
if (c === 'start') return 'starting';
if (c === 'stop') return 'stopping';
const _x: never = c;
return _x;
}
console.log(run('start'));تحقق سريع
اختبر مدى فهمك لنوع never.
مراجعة: never
لقد تعلمتم أن never:
- هو النوع الفارغ؛ فلا يمكن أن تكون أي قيمة من النوع never.
- هو نوع الإرجاع للدوال التي ترمي استثناءً أو تستمر في الدوران إلى ما لا نهاية.
- يُمكّن من إجراء فحوصات الشمولية في الحالات الافتراضية من switch.
- يظهر في فروع تضييق النوع المستحيلة، ويُرشّح الاتحادات في منطق الأنواع.
بعد ذلك، سنلقي نظرة على void والفرق بينه وبين never.
function assertNever(x: never): never {
throw new Error('Unexpected: ' + String(x));
}
console.log('assertNever guards exhaustiveness');تعلم TypeScript مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 101
- الدروس
- 352
الأسئلة الشائعة
هل درس «نوع never والحالات المستحيلة» مجاني؟
نعم — نص درس «نوع never والحالات المستحيلة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة TypeScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة TypeScript Academy 4 دروس في المجموع.
ماذا ستتعلم في «نوع never والحالات المستحيلة»؟
نمذجوا التعليمات البرمجية غير القابلة للوصول والقيم المستحيلة باستخدام never تتمرن على TypeScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ TypeScript Academy؟
لا تُشترط خبرة سابقة. TypeScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «نوع never والحالات المستحيلة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس TypeScript Academy هذا؟
نعم. كل درس في TypeScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- فهم unknown مقارنةً بـ any
- نوع never والحالات المستحيلة
- نوع void في الدوال
- التعامل الآمن نوعيًا مع unknown