Exclude<T, U> Exclude (مع Extract)
آخر تحديث: 2026-10-22
Exclude<T, U> Exclude (مع Extract)
يستبعد Exclude<T, U> من النوع الاتحادي T الأعضاء «القابلين للإسناد إلى U»، ويُستعمل عادة لقصّ الفروع غير المهتم بها من اتحاد كبير. أما عمليته المعكوسة Extract<T, U> فتحتفظ فقط بالأعضاء القابلين للإسناد إلى U. وكلاهما يستند إلى الخاصية التوزيعية للأنواع الشرطية.
| المجموعة | الأنواع المساعدة |
|---|---|
| النوع | نوع |
| الوضع الصارم | غير مطلوب |
ℹ️ معلومة يحوّل المحرر لغة TypeScript إلى JavaScript ثم يشغّلها (بدون فحص أنواع)؛ راجع ناتج كل مثال لنتيجة فحص الأنواع.
📝 الصيغة
type Exclude<T, U> = T extends U ? never : T;
type Extract<T, U> = T extends U ? T : never;
// الاستخدام
type PassiveEvent = Exclude<EventType, "click" | "keydown">;
type Interactive = Extract<EventType, "click" | "keydown">;
⚙️ المعاملات
| T | النوع الاتحادي المصدر؛ يخضع كل عضو للاختبار الشرطي بدوره (التوزيع) |
|---|---|
| U | شرط التصفية: الأعضاء القابلون للإسناد إلى U يُستبعدون (Exclude) أو يُحتفظ بهم (Extract) |
القيمة المُعادة:نوع اتحادي جديد: Exclude هو الفرق T ناقص U؛ وExtract هو تقاطع T مع U.
▶ مثال
عدّل الكود أدناه واضغط «جرّب» لرؤية نتيجة التحويل:
الناتج:
focus | scroll | wheel
click | keydown
(مخرجات التشغيل بعد الترجمة؛ الأثر على مستوى النوع: محاولة الإضافة push للقيمة "click" إلى passiveEvents خطأ في الترجمة — فقد استبعدتها Exclude من PassiveEvent من قبل)
💡 نقاط مهمة
ℹ️ معلومة المبدأ «الأنواع الشرطية الموزَّعة»: عندما يكون T اتحادًا تُقيَّم الصيغة T extends U عضوًا عضوًا ثم تُدمج النتائج. فالعضو المطابق لـ U يصبح never (ويختفي من الاتحاد) — وهذه هي آلية «الاستبعاد».
⚠️ تنبيه لا معنى لهاتين الأداتين إلا مع الأنواع الاتحادية. فاستخدامهما على نوع كائن غير اتحادي لا يعالج الخصائص واحدًا تلو الآخر وسلوكه مخالف للحدس — وللتعامل مع خصائص الكائنات استخدم Omit/Pick.
💡 تلميح النوع NonNullable<T> ليس إلا اسمًا مخصصًا لـ Exclude<T, null | undefined>. وتذكّر هذه العلاقة تتيح لك نقل فهم Exclude إليه مباشرة.
🏷️ الأنواع المساعدة ذات صلة
💡 حالات ذات صلة
المزيد من الحالات قادم قريبًا.
📚 دروس ذات صلة
❓ أسئلة شائعة
س ما الفرق بين Exclude و Omit؟
ج تعمل Exclude على «أعضاء» النوع الاتحادي، بينما تعمل Omit على «مفاتيح خصائص» نوع الكائن. والـ Omit مُنفَّذة في جوهرها عبر Exclude: يقتطع Exclude<keyof T, K> المفاتيح قبل Pick. الأولى تدير الأعضاء والثانية المفاتيح.
س لماذا سُميت «توزيعية»؟ وماذا لو لم تتوزع؟
ج من دون التوزيع ستقارن T extends U الاتحاد "click"|"focus"|... ككل مع U فتجده غير قابل للإسناد ولن تستبعد شيئًا. أما التوزيع فيختبر كل عضو منفردًا — وهذه هي آلية «التصفية» العضوًا عضوًا للاتحاد.
س هل يمكن لـ Exclude استبعاد أعضاء من كائنات؟
ج نعم، ما دام نوع العضو قابلًا للإسناد إلى U. مثلاً مع type Shape = Circle | Square تستبعد Exclude<Shape, Square> الصنف Square. المعيار دائمًا «قابلية الإسناد» لا التساوي الحرفي.