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"، وهذا الأمان بالذات هو سبب ملاءمته كحارس للأنواع.