T extends U ? X : Y الأنواع الشرطية

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

T extends U ? X : Y الأنواع الشرطية

تجعل الأنواع الشرطية النوع «يختار»: T extends U ? X : Y — عند تحقق الشرط تُختار X وإلا تُختار Y. وتنقل الأنواع الشرطية الحكم الثلاثي في وقت التشغيل إلى مستوى النوع، ومع الأنواع العامة يمكن كتابة أنواع إرجاع تتبدل وفق نوع المعامل.

المجموعةالأنواع العامة
النوعبناء الجملة
الوضع الصارمغير مطلوب

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

📝 الصيغة

type Wrapped<T> = T extends string
  ? { kind: "str"; value: T }
  : { kind: "num"; value: number };

type A = Wrapped<string>;  // { kind: "str"; value: string }
type B = Wrapped<number>;  // { kind: "num"; value: number }

// الاتحادات تتوزع عبر الفحص (نوع شرطي توزيعي)
type ToArray<T> = T extends unknown ? T[] : never;

⚙️ المعاملات

T extends Uحكم الشرط: إذا كان التوافق البنيوي قائمًا تُؤخذ فرع الصواب
? X : Yفرعا الشرط: كلاهما تعبير نوع كامل، ويمكن الاستمرار في تداخل الشروط

القيمة المُعادة:الأنواع الشرطية عملية خالصة على مستوى النوع ولا تنتج كود تشغيل؛ ونتيجتها تتوقف على وفاء معامل النوع العام بـ extends.

▶ مثال

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

الناتج:

{"kind":"str","value":"hi"}
{"kind":"num","value":7}

(مخرجات التشغيل بعد التحويل؛ wrap(true) سيعطي خطأ ترجمة — لا يوجد أي تحميل زائد يقبل boolean)

💡 نقاط مهمة

ℹ️ معلومة معامل النوع الصِرف يواجه نوع الاتحاد بـ«التوزيع»: فـ ToArray<string | number> يعطي string[] | number[] لا (string | number)[] — وهذه الخاصية التوزيعية للأنواع الشرطية، وهي مبدأ تنفيذ Exclude أيضًا.
💡 تلميح never في الأنواع الشرطية إشارة «إلى الاستبعاد»: type NonNull<T> = T extends null | undefined ? never : T يزيل أعضاء القيم الفارغة تلقائيًا بعد التوزيع.
⚠️ تنبيه قابلية القراءة تنهار فجأةً عند تجاوز الأنواع الشرطية ثلاث طبقات: ما يمكن حله بأنواع المفاضلة أو الوصول المفهرس فلا تستخدم فيه الشرطية؛ وعند التداخل استخدم اسم type وسيطًا لتقسيم الخطوات.
المزيد من الحالات قادم قريبًا.

📚 دروس ذات صلة

❓ أسئلة شائعة

س كيف تختار بين الأنواع الشرطية والتحميل الزائد للدوال؟
ج عندما يكون منطق النوع بسيطًا (فرع أو فرعان) اكتب توقيعًا واحدًا بنوع شرطي؛ وعندما تكتثر الفروع أو تتطلب الدقة إلى الحرف استخدم التحميل الزائد فهو أوضح. ويمكن خلط الاثنين (مثل المثال).
س لماذا «يحقق» T extends string أيضًا string | number؟
ج هذا فعل التوزيع: يُفك اتحاد الأنواع ويُفحص واحدًا تلو الآخر ثم يُدمج. وللفحص ككل (بلا توزيع) استخدم صيغة تغليف المجموعة [T] extends [string].
س هل يمكن استخدام الأنواع الشرطية على معاملات الدوال؟
ج نعم لكن بحذر: فالنوع الشرطي في موضع المعامل يجعل استدلال المستدعي ملتبسًا؛ والممارسة الأكثر شيوعًا أن يكون المعامل عامًا ويكون نوع الإرجاع شرطيًا مترابطًا.
Web-Tutorial.com

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

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

100%