! التأكيد غير الفارغ

آخر تحديث: 2026-10-22

! التأكيد غير الفارغ

يخبر التأكيد غير الفارغ (اللاحقة !) المترجم بأن «هذه القيمة قطعًا ليست null/undefined الآن»، فيطوي T | null | undefined إلى T. وهو لا يجري أي فحص في وقت التشغيل — فإن كانت القيمة فارغة فعلًا فسوف يتكشف الخطأ لاحقًا عند الوصول إلى الأعضاء؛ لذا احتفظ به للحالات التي استبعدت فيها الفراغ حقًا.

المجموعةتضييق الأنواع والتأكيدات
النوععامل
الوضع الصارمغير مطلوب

ℹ️ معلومة يحوّل المحرر لغة TypeScript إلى JavaScript ثم يشغّلها (بدون فحص أنواع)؛ راجع ناتج كل مثال لنتيجة فحص الأنواع.

📝 الصيغة

const el = document.getElementById("root")!;  // HTMLElement وليس HTMLElement | null

const user = map.get("alice")!;                // User وليس User | undefined
console.log(user.name);

⚙️ المعاملات

!معامل لاحق يوضع بعد التعبير: يزيل null وundefined فقط من النوع ولا يولّد أي شيفرة وقت تشغيل

القيمة المُعادة:لا أثر له في وقت التشغيل — تزول ! تمامًا بعد الترجمة؛ وفي وقت الترجمة يقتصر عمله على إزالة null/undefined من النوع.

▶ مثال

عدّل الكود أدناه واضغط «جرّب» لرؤية نتيجة التحويل:

الناتج:

100
no record

(مخرجات التشغيل بعد الترجمة. نجاح الفحص النوعي للعبارة aliceScore + 9 سببه أن ! قد ضيّقت النوع؛ أما كتابة scores.get("bob")! + 1 فستنجح في الترجمة لكنها تعطي NaN في وقت التشغيل — فـ ! لا تفحص شيئًا)

💡 نقاط مهمة

⚠️ تنبيه الـ ! وعد شفهي للمترجم بلا أي تحقق في وقت التشغيل. الوعد الخاطئ لا يُفشل فورًا بل يرمي TypeError عند وصول لاحق إلى خاصية ما، وهو ما يصعب تعقبه. فضّل if (x) أو ?? متى ناسبا الحالة.
ℹ️ معلومة الـ ! تزيل null/undefined فقط ولا تضيّق غير ذلك: كتابة x! على string | number | null تعطي string | number لا string.
💡 تلميح حالات مقبولة عمومًا: بعد getElementById عندما يكون وجود العنصر مؤكدًا؛ الوصول إلى get لنفس المفتاح مباشرة بعد Map.set؛ بناء بيانات الاختبار. أما تكدس ! في مسار العمل الأساسي فمن روائع الشيفرة السيئة.
المزيد من الحالات قادم قريبًا.

📚 دروس ذات صلة

❓ أسئلة شائعة

س ما الفرق بين ! و ?. (السلسلة الاختيارية)؟
ج الاتجاهان متعاكسان: ! تدّعي «غير فارغ قطعًا» (وستنفجر مع ذلك إذا كانت فارغة)، بينما ?. تقرّ «قد تكون فارغة» وتختصر المسار عائدةً بـ undefined. استخدم ?. دفاعيًا، ولا تستخدم ! إلا إذا كنت متأكدًا.
س هل ما زالت ! مطلوبة بعد إيقاف strictNullChecks؟
ج لا — فمع إيقاف strictNullChecks يمكن إسناد null/undefined إلى أي نوع فلا عمل لـ !. وهذا أحد أسباب التوصية بتفعيل strictNullChecks دائمًا: بدونه تتحول ! إلى ضجيج صرف وتنتقل أخطاء الفراغ بالكامل إلى وقت التشغيل.
س لماذا يعطّل كثير من الفرق ! في ESLint؟
ج لأن ! تبتلع مخاطر الفراغ بصمت، وعلى خلاف فحص if لا تعطي خطأ ترجمة عندما تبطل إعادة الهيكلة افتراضها. تعطيلها يفرض الحراسات أو بدائل ?? وهو الأسلم على المدى الطويل؛ والحالات النادرة المبررة تُعفى بسطر eslint-disable على مستوى السطر.
Web-Tutorial.com

فريق Web-Tutorial التقني

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

100%