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

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

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

حارس typeof هو أكثر حراسات الأنواع شيوعًا: في وقت التشغيل يعيد typeof سلسلة تصف نوع القيمة، ويضيّق TypeScript النوع الاتحادي تبعًا لذلك. فبعد typeof value === "string" مثلاً تُعامَل value بوصفها string ويصبح استدعاء دوال السلاسل آمنًا.

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

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

📝 الصيغة

function toNumber(value: string | number): number {
  if (typeof value === "string") {
    return Number(value);   // value: string هنا
  }
  return value;             // value: number هنا
}

⚙️ المعاملات

typeof valueيُقيَّم في وقت التشغيل ويعيد إحدى ثماني سلاسل: "string" / "number" / "boolean" / "object" / "function" / "undefined" / "symbol" / "bigint"

القيمة المُعادة:يعيد تعبير typeof نفسه سلسلة النوع؛ أما تأثير التضييق فيحدث في وقت الترجمة — داخل الفرع يصبح نوع المتغير هو النوع المحدد المطابق.

▶ مثال

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

الناتج:

string of length 5
number, doubled = 42
boolean: off

(مخرجات التشغيل بعد الترجمة؛ نجاح الفحص النوعي للوصول إلى value.length وvalue * 2 داخل كل case سببه أن تضييق typeof قد مُرِّر — التضييق مضمون ساكنًا بواسطة tsc، وفي وقت التشغيل لا توجد سوى القيم)

💡 نقاط مهمة

ℹ️ معلومة typeof null === "object" أثر تاريخي موروث من JS. يتعامل معه TypeScript داخليًا: بعد فحص typeof يضيَّق فرع null بصورة صحيحة ولا يتسرب أبدًا إلى فرع "object".
⚠️ تنبيه لا يستطيع typeof التمييز بين المصفوفات والكائنات العادية — كلاهما يعيد "object". استخدم Array.isArray(x) للتمييز بين المصفوفات، واستخدم in أو الأنواع الاتحادية القابلة للتمييز للتمييز بين أشكال الكائنات.
💡 تلميح لـ typeof هويتان: في موضع القيمة هو معامل وقت تشغيل، وفي موضع النوع هو معامل أنواع (type T = typeof someVar يأخذ نوع المتغير). تتناول هذه المدخلة استخدام الأول في التضييق.
المزيد من الحالات قادم قريبًا.

📚 دروس ذات صلة

❓ أسئلة شائعة

س لماذا تبقى المصفوفة "object" بعد فحص typeof؟
ج المصفوفات كائنات في JS، لذا يعيد typeof عنها "object". يوفر TypeScript الحارس المخصص Array.isArray() لتضييق المصفوفات — وهو الأداة الصحيحة لاتحادات مثل string | number[].
س هل يوجد فرق بين switch (typeof value) وسلسلة if متتالية؟
ج تأثير التضييق مطابق تمامًا — كلاهما صيغة حارس يتعرف عليها TS. تصبح switch أقروى عند تجاوز عدد الفروع الثلاثة، كما تتكامل مع فحص الاستنفاد (استخدام never في default) لكشف الفروع الناقصة.
س هل قد يرمي typeof value === "string" خطأً في وقت التشغيل؟
ج لا. typeof من المعاملات النادرة الآمنة على أي تعبير — حتى مع متغير غير معرَّف يعيد فقط "undefined"، وهذا الأمان بالذات هو سبب ملاءمته كحارس للأنواع.
Web-Tutorial.com

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

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

100%