infer الكلمة المفتاحية infer
آخر تحديث: 2026-10-22
infer الكلمة المفتاحية infer
تقوم infer في فرع الصواب للنوع الشرطي بـ«التقاط» النوع: T extends Array<infer U> ? U : never تعني «إذا كان T مصفوفة، فاستخرج نوع عناصره وأطلق عليه اسم U». وهي ترفع المطابقة من «مطابقة ثم إهمال» إلى «مطابقة واستخراج»، وهي جوهر أنواع الأدوات مثل Unwrap وReturnType.
| المجموعة | الأنواع العامة |
|---|---|
| النوع | عامل |
| الوضع الصارم | غير مطلوب |
ℹ️ معلومة يحوّل المحرر لغة TypeScript إلى JavaScript ثم يشغّلها (بدون فحص أنواع)؛ راجع ناتج كل مثال لنتيجة فحص الأنواع.
📝 الصيغة
type ItemOf<T> = T extends Array<infer U> ? U : never;
type A = ItemOf<string[]>; // string
type B = ItemOf<number[]>; // number
// يمكن لـ infer أن يظهر في أي موضع من النمط
type FirstArg<T> = T extends (first: infer A, ...rest: any[]) => any ? A : never;
⚙️ المعاملات
| infer U | تصريح موضع نوع: أثناء مطابقة extends يُلتقط نوع الموضع في U |
|---|---|
| T extends X ? U : Y | نطاق U: يكون نافذًا فقط داخل فرع الصواب للنوع الشرطي الحالي، وغير مرئي خارجه |
القيمة المُعادة:infer بذاتها ليست نوعًا بل «ربط» يحدث أثناء عملية المطابقة؛ وقيمة الإرجاع للنوع الشرطي كله تُحسب بمشاركة نتيجة الالتقاط.
▶ مثال
عدّل الكود أدناه واضغط «جرّب» لرؤية نتيجة التحويل:
الناتج:
11 A
(مخرجات التشغيل بعد التحويل؛ n و s هما number و string في وقت الترجمة — فقد استخرج infer نوع العناصر من نوع المصفوفة)
💡 نقاط مهمة
ℹ️ معلومة يمكن لـ infer الظهور في أي موضع في نمط extends: فـ Promise<infer U> تلتقط نوع resolve، و [any, infer R] تلتقط الموضع الثاني من المجموعة، و (x: infer P) => any تلتقط المعامل — الموضع هو الدلالة.
💡 تلميح تكرار infer بالاسم نفسه يؤدي إلى «دمج الالتقاط»: [infer T, infer T] تطابق [number, number] فتعطي number، وتفشل عند المطابقة مع [string, number] — فحص طبيعي لـ«اتساق النوع».
⚠️ تنبيه لا يمكن استخدام infer إلا داخل جملة extends للنوع الشرطي، وكتابة type U = infer X منفردةً خطأ صياغة؛ ولا يمكن الإشارة إلى U في فرع الفشل أيضًا.
🏷️ الأنواع العامة ذات صلة
💡 حالات ذات صلة
المزيد من الحالات قادم قريبًا.
📚 دروس ذات صلة
❓ أسئلة شائعة
س ما الفرق بين infer ومعامل النوع العام <T>؟
ج معامل النوع العام «يُعطى من المستدعي»، بينما infer «يُستخرج من نوع موجود». الأول يصرح بالمدخل والثاني يستخرج المعلومات — فـ ReturnType<T> يستدل بالـ infer على قيمة الإرجاع من نوع الدالة.
س ماذا يكون U الملتقط عندما يفشل التطابق؟
ج لا تطابق يعني لا ربط — ينتقل التنفيذ مباشرة إلى فرع الفشل. لذا يُكتب في فرع الفشل عادةً never أو unknown كشبكة أمان.
س أي أدوات مدمجة تستخدم infer؟
ج ReturnType وParameters وConstructorParameters وAwaited وغيرها: كلها ضربة مركبة من extends + infer؛ فبمجرد إتقان infer تصبح قادرًا على فهم نصف شيفرة أنواع الأدوات تقريبًا.