A | B الأنواع الاتحادية

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

A | B الأنواع الاتحادية

يعني النوع الاتحادي A | B أن "القيمة واحدة من A أو B". ويجب تضييق قيمة الاتحاد قبل استخدامها (بـ typeof أو in وغيرهما) حتى يعرف المترجم أي الصيغ يواجه الآن.

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

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

📝 الصيغة

type Id = string | number;
let id: Id = "u1";
id = 42; // كلاهما صالح

if (typeof id === "number") {
  id.toFixed(0); // الوصول إلى الأعضاء يتطلب التضييق أولًا
}

⚙️ المعاملات

A | Bأعضاء مفصولة بالشريط العمودي | بلا حد لعددها، وتُدمج الأعضاء المكررة تلقائيًا

القيمة المُعادة:لا قيمة مُعادة — الأنواع الاتحادية مفهوم خاص بطبقة الأنواع فقط وتختفي بعد الترجمة.

▶ مثال

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

الناتج:

ABC 3.14

(مخرجات التشغيل بعد التحويل؛ استدعاء value.toUpperCase() خارج if دون تضييق يؤدي إلى خطأ ترجمة)

💡 نقاط مهمة

ℹ️ معلومة قيمة الاتحاد غير المضيَّقة لا تتيح الوصول إلا إلى الخصائص/الدوال المشتركة بين كل الأعضاء — فالمترجم لا يستطيع تحديد الصيغة الحالية.
💡 تلميح اختر أداة التضييق حسب السيناريو: typeof (للقيم الأصلية)، و in (لوجود الخاصية)، و instanceof (لنسخ الفئات)، والمساواة الحرفية (للاتحادات المُميَّزة).
⚠️ تنبيه كثرة فروع الاتحاد تُلزم كل موضع استخدام بكتابة تضييق، فترتفع كلفة الصيانة؛ وإذا اشتركت الفروع في حقل تسمية ففكّر في تحويلها إلى اتحاد مميَّز.
المزيد من الحالات قادم قريبًا.

📚 دروس ذات صلة

❓ أسئلة شائعة

س لماذا يجب التضييق قبل استدعاء الدوال؟
ج لأن استدعاء toUpperCase على النوع string | number سيستفحل إذا كانت القيمة في وقت التشغيل عددًا. يطلب منك المترجم إثبات أن "القيمة الحالية string"، والتضييق هو عملية الإثبات هذه.
س ما الفرق بين النوع الاتحادي و any؟
ج يحصر الاتحاد "الاحتمالات المسموحة" ويرفض مباشرةً ما خارجها؛ بينما يسمح any بكل شيء ويفقد كل فحص. فالاتحاد "خيارات محدودة" و any "استسلام عن الحكم".
س ما هو الاتحاد المُميَّز (discriminated union)؟
ج اتحاد يحمل كل فرع فيه حقلًا حرفيًا (مثل kind: "circle" | "rect")؛ فبجعل switch على هذا الحقل تتضيّق الكائنة كلها دفعة واحدة. راجع مدخل discriminated-unions للتفاصيل.
Web-Tutorial.com

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

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

100%