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].
س هل يمكن استخدام الأنواع الشرطية على معاملات الدوال؟
ج نعم لكن بحذر: فالنوع الشرطي في موضع المعامل يجعل استدلال المستدعي ملتبسًا؛ والممارسة الأكثر شيوعًا أن يكون المعامل عامًا ويكون نوع الإرجاع شرطيًا مترابطًا.