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 تضييق تلقائي، كما يمكن إعادة استخدام مثل هذه الثوابت في الفحوص. ومع ذلك تبقى الحراسات المسمّاة أنفع صيغة لإعادة الاستخدام.