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. المعيار دائمًا «قابلية الإسناد» لا التساوي الحرفي.
Web-Tutorial.com

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

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

100%