instanceof تضييق الأنواع بـ instanceof

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

instanceof تضييق الأنواع بـ instanceof

يُستخدم حارس instanceof مع اتحادات «الأصناف» (classes): يتحقق مما إذا كانت القيمة نسخةً من صنف معين، وعندها يضيّق TS نوعها إلى ذلك الصنف. يجري فحصًا حقيقيًا لسلسلة النماذج الأولية في وقت التشغيل، وهو الأداة المعيارية للتعامل مع اتحادات تتضمن Date وMap وError والأصناف المخصصة.

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

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

📝 الصيغة

function logValue(x: Date | string) {
  if (x instanceof Date) {
    console.log(x.toISOString());  // x: Date
  } else {
    console.log(x.toUpperCase());  // x: string
  }
}

⚙️ المعاملات

instanceof Klassفي وقت التشغيل يتفقد سلسلة النماذج الأولية ليرى ما إذا كان Klass.prototype يظهر على نموذج الكائن الأولي؛ ويضيّق TS في الوقت نفسه النوع إلى Klass (أو أحد أصنافه الفرعية)

القيمة المُعادة:يعيد تعبير instanceof قيمة منطقية (boolean)؛ ويحدث التضييق في وقت الترجمة، مع اشتراط أن يكون الطرف الأيمن من instanceof دالّة بانية تمتلك prototype.

▶ مثال

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

الناتج:

Article: TS Basics
Video: 95s

(مخرجات التشغيل بعد الترجمة؛ نجاح الفحص النوعي للوصول إلى item.title وitem.duration سببه أن تضييق instanceof قد مُرِّر — التضييق مضمون ساكنًا بواسطة tsc، وفي وقت التشغيل لا توجد سوى القيم)

💡 نقاط مهمة

ℹ️ معلومة instanceof فحص حقيقي في وقت التشغيل (يفتش سلسلة النماذج الأولية)، لذا لا يتعرّف على الكائنات «الشبيهة» الناتجة عن JSON.parse — فنموذجها الأولي هو Object.prototype وليس صنفك.
⚠️ تنبيه لا يمكن استخدام instanceof مع الواجهات (interface) — فهي تُمحى عند الترجمة ولا يوجد باني يمكن فحصه. ميّز بين أشكال الواجهات باستخدام in أو الحراسات المخصصة أو الأنواع الاتحادية القابلة للتمييز.
💡 تلميح الكائنات الواردة من iframe آخر أو من نطاق vm آخر تمتلك نموذجًا أوليًا مختلفًا عن الصنف المحلي، وقد يعيد instanceof false بالخطأ. تحقق من بيانات الحدود هذه بنيويًا عبر حارس نوع مخصص.
المزيد من الحالات قادم قريبًا.

📚 دروس ذات صلة

❓ أسئلة شائعة

س هل يعمل instanceof مع تضييق الأصناف الفرعية؟
ج نعم. يتفقد instanceof سلسلة النماذج الأولية، فنسخة الصنف الفرعي تجتاز instanceof Parent أيضًا، بينما تفشل نسخة الصنف الأب في instanceof Child. ويأخذ TS علاقات الوراثة في الحسبان عند التضييق.
س لماذا يعيد instanceof دائمًا false مع نتائج JSON.parse؟
ج ينتج JSON.parse كائنات عادية نموذجها الأولي Object.prototype، ولا يحمل نموذج صنفك الأولي في سلسلته. للتحقق من البنية استخدم حارس نوع مخصص (x is T) تفحص به الحقل تلو الحقل.
س أيّهما أختار: instanceof أم typeof؟
ج استخدم typeof مع الأنواع الأولية (string/number/boolean وأمثالها)، وinstanceof مع نسخ الأصناف (Date وMap والأصناف المخصصة). كلاهما فحص حقيقي في وقت التشغيل ويمكن الجمع بينهما بحرية.
Web-Tutorial.com

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

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

100%