contextual الأنواع السياقية
آخر تحديث: 2026-10-22
contextual الأنواع السياقية
النوع السياقي: عندما يقع كدالة مجهولة في «موضع نوعه معروف مسبقًا» (تعليق متغير، استدعاء راجع لطريقة مصفوفة، معالج حدث)، يستنتج TS أنواع معاملاتها عكسيًا — دون حاجة لكتابة تعليقات يدويًا. فالمتغير o في map((o) => o.id) له نوع ليس لاستدلال من الدالة نفسها، بل لأنه قادم من نوع عناصر المصفوفة، أي من «السياق».
| المجموعة | الدوال والأصناف |
|---|---|
| النوع | بناء الجملة |
| الوضع الصارم | غير مطلوب |
ℹ️ معلومة يحوّل المحرر لغة TypeScript إلى JavaScript ثم يشغّلها (بدون فحص أنواع)؛ راجع ناتج كل مثال لنتيجة فحص الأنواع.
📝 الصيغة
const orders: Order[] = [];
// يأخذ مُعامل الدالة o نوعه السياقي Order من نوع عناصر orders
const summaries = orders.map((o) => `#${o.id}: ${o.total}`);
// تأشيرة المتغير توفر سياقًا أيضًا
type ClickHandler = (event: { x: number; y: number }) => void;
const onClick: ClickHandler = (event) => console.log(event.x, event.y);
⚙️ المعاملات
| const x: T = ... | المواضع التي تُفعّل الاستدلال السياقي: تعليقات أنواع المتغيرات/المعاملات، عناصر المصفوفات، معاملات الاستدعاء (وفق نوع المعامل الشكلي)، وتعبيرات return (مواجهة نوع الإرجاع المُعلن) |
|---|---|
| (x) => ... | معاملات الاستدعاء الراجع بلا تعليق تحصل على نوعها من السياق؛ وإذا كُتب التعليق فيجب أن يكون متوافقًا مع السياق وإلا أخطأ |
القيمة المُعادة:تخضع تعبيرات return أيضًا لقيود السياق: فنوع الإرجاع المُعلن يفحص كل return عكسيًا، فيلتقط مبكرًا أخطاء مثل «نسيان return في أحد الفروع».
▶ مثال
عدّل الكود أدناه واضغط «جرّب» لرؤية نتيجة التحويل:
الناتج:
#101: 250, #102: 90, #103: 480
2
click @ 12,34
(مخرجات التشغيل بعد التحويل؛ كتابة o.pric (اسم خاصية مخطئ) في الاستدعاء الراجع تعطي خطأ ترجمة فوريًا — النوع السياقي لا يسمح به)
💡 نقاط مهمة
ℹ️ معلومة الاستدلال السياقي هو تدفق الأنواع «من الخارج إلى الداخل»، عكس الاستدلال العادي (من التعبير إلى المتغير)؛ وعندما يتحقق كلاهما يغلب الطرف صاحب التعليق الصريح.
💡 تلميح وجود تحذير «any ضمني» بجوار معامل استدعاء راجع يعني عادةً أن السياق مفقود (المصفوفة غير مُعلَّمة النوع) — أصلح النوع الخارجي أولًا بدلًا من تعليق الاستدعاء الراجع.
⚠️ تنبيه استدعاءات مثل onChange={(e) => ...} في React تعتمد على الأنواع السياقية؛ وعند استخراجها منفردة (مثلًا بتغليفها في useCallback) عليك إضافة التعليق بنفسك وإلا تدهورت المعاملات إلى any.
🏷️ الدوال والأصناف ذات صلة
💡 حالات ذات صلة
المزيد من الحالات قادم قريبًا.
❓ أسئلة شائعة
س هل النوع السياقي والاستدلال النوعي شيء واحد؟
ج لا. الاستدلال العادي «من القيمة إلى النوع» (const x = 5 ← number)؛ أما النوع السياقي «من الموضع إلى القيمة» — يُعرف النوع الهدف أولًا ثم تُستنتج معاملات الدالة المجهولة عكسيًا. وأنواع معاملات الاستدعاءات الراجعة تأتي منه في الغالب.
س لماذا معامل استدعائي الراجع في map من نوع any؟
ج لأن المصفوفة نفسها غير مُعلَّمة النوع (مثلًا من JSON.parse أو تعليق منسٍّ)، فلا يوجد سياق تُستعار منه الأنواع ويصبح المعامل any ضمنيًا؛ علّم نوع عناصر المصفوفة فيُصلَح الأمر.
س هل يسمح النوع السياقي «بتسرب» الأخطاء؟
ج على العكس تمامًا — فهو أساس الفحص. الوصول إلى خاصية غير موجودة في النوع السياقي يعطي خطأً فوريًا (وحتى الحقل الزائد غير مقبول)، وهذا بالضبط سبب قدرته على التقاط أخطاء الأسماء المخطوئة.