x is T حراسات الأنواع المخصصة ودوال التأكيد

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

x is T حراسات الأنواع المخصصة ودوال التأكيد

عندما لا تكفي الحراسات المدمجة (typeof/instanceof/in) يمكنك كتابة دالة حارسة للنوع بنفسك: اكتب نوع قيمتها المرجعة على الصيغة x is T (محصّلة نوع)، وسيضيّق TS النوع x إلى T في الفروع التي تعيد فيها الدالة true. وشقيقتها دالة التأكيد (asserts x is T) التي لا تعيد قيمة منطقية بل ترمي خطأ مباشرة.

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

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

📝 الصيغة

// المحصّلة النوعية: يُضيَّق x إلى T حيث تعيد الدالة true
function isFoo(x: unknown): x is Foo {
  return typeof x === "object" && x !== null && "foo" in x;
}

// دالة تأكيد: تُلقي خطأً عند عدم الصلاحية؛ وبعدها يُعامل x كـ T
function assertFoo(x: unknown): asserts x is Foo {
  if (!isFoo(x)) throw new Error("not a Foo");
}

⚙️ المعاملات

x is Tنوع قيمة الإرجاع «محصّلة النوع»: اسم المعامل is نوع الهدف. يجب أن يجري متن الدالة فحصًا حقيقيًا في وقت التشغيل
asserts x is Tنوع قيمة الإرجاع «دالة التأكيد»: يجب أن يرمي استثناءً عند فشل التحقق؛ وتعامل الشيفرة اللاحقة للاستدعاء x بوصفها T

القيمة المُعادة:دالة المحصّلة is دالة منطقية عادية في وقت التشغيل؛ والتضييق يحدث في وقت الترجمة. أما دالة asserts فلا تعيد شيئًا (void) في وقت التشغيل وتُشير إلى الفشل بالرمي (throw).

▶ مثال

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

الناتج:

failed: 404
data: x,y

(مخرجات التشغيل بعد الترجمة؛ بعد إعادة isFailure القيمة true يضيّق res إلى ApiError ويصبح الوصول إلى res.data ناجحًا نوعيًا — التضييق مضمون ساكنًا بواسطة tsc، وفي وقت التشغيل لا توجد سوى القيم)

💡 نقاط مهمة

ℹ️ معلومة الصيغة x is T تغيّر رأي المترجم فقط — في وقت التشغيل هي دالة عادية. يجب أن تطابق الفحوصات في متنها النوع T المعلن، وإلا فأنت تكذب على المترجم.
⚠️ تنبيه الحارس الخاطئ لن يكشفه المترجم: إعلان res is ApiError مع فحص حقول لا علاقة لها يجعل النوع الخطأ يتسلل إلى الفرع بصمت ثم ينفجر في وقت التشغيل. اختبر منطق حارسك.
💡 تلميح اكتب نوع المعامل unknown بدلًا من any — فالـ unknown يحجب كل العمليات حتى يتم التضييق، مما يرغمك على كتابة منطق تحقق كامل.
المزيد من الحالات قادم قريبًا.

📚 دروس ذات صلة

❓ أسئلة شائعة

س ما الفرق بين x is T وإعادة boolean مجردة؟
ج مع إعادة boolean لا يعرف المترجم ماذا يعني true فيبقى نوع x كما هو بعد الاستدعاء؛ أما مع x is T فيضيّق x إلى T في فرع true. المحصّلة تعمل على مستوى النوع فقط بلا أي تكلفة إضافية في وقت التشغيل.
س متى أستخدم نسخة asserts بدلًا من is؟
ج استخدم asserts x is T عندما يجب إنهاء التنفيذ فورًا عند بيانات غير صالحة (تحميل الإعدادات، تأكيدات الاختبار، التحقق من البيئة) — فهي ترمي عند الفشل وتتقدم الشيفرة اللاحقة باطمئنان؛ واستخدم is عندما تحتاج معالجة «فرعين» لنتيجتين محتملتين (النجاح إلى A والفشل إلى B).
س هل توجد صيغة أيسر منذ TS 4.4؟
ج نعم: منذ TS 4.4 تتيح «الشروط المستعارة» (aliased conditions) أن يُستنتج من const isFailure = res.ok === false تضييق تلقائي، كما يمكن إعادة استخدام مثل هذه الثوابت في الفحوص. ومع ذلك تبقى الحراسات المسمّاة أنفع صيغة لإعادة الاستخدام.
Web-Tutorial.com

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

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

100%