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 للتفاصيل.