TypeScript Academy · درس

اتحادات الأنواع المميّزة لمطابقة الأنماط بأمان

أضيفوا حقلًا حرفيًا مشتركًا إلى أعضاء الاتحاد لضمان أمان الأنواع

الدرس 3 من 413 خطوة

اتحادات الأنواع المميّزة لمطابقة الأنماط بأمان درس مجاني في TypeScript Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في TypeScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة TypeScript Academy 4 دروس في المجموع.

مرحبًا

تضيف الاتحادات المميّزة خاصية حرفية مشتركة إلى أعضاء الاتحاد. ويستخدم TypeScript هذه الخاصية المميّزة لتضييق النوع في عبارات switch وif.

الخاصية المميّزة

الخاصية المميّزة هي خاصية لها نوع حرفي فريد في كل عضو من أعضاء الاتحاد. ويضيّق TypeScript الاتحاد بناءً على قيمتها.
type Circle = { kind: 'circle'; radius: number };
type Square = { kind: 'square'; side: number };
type Shape = Circle | Square;

التضييق باستخدام عمليات التحقق في if

تحقق من الخاصية المميّزة في عبارة if. وسيضيّق TypeScript النوع إلى العضو المطابق.
function area(shape: Shape): number {
  if (shape.kind === 'circle') {
    return Math.PI * shape.radius ** 2;
  }
  return shape.side ** 2; // narrowed to Square
}

التضييق باستخدام switch/case

تعمل عبارات switch بشكل مثالي مع الاتحادات المميّزة. إذ يضيّق كل case النوع إلى عضو محدد.
function describe(shape: Shape): string {
  switch (shape.kind) {
    case 'circle': return `Circle r=${shape.radius}`;
    case 'square': return `Square s=${shape.side}`;
  }
}

التحقق من اكتمال الحالات باستخدام never

أضف حالة افتراضية تسند القيمة إلى `never`. إذا أضفت عضوًا جديدًا إلى الاتحاد ونسيت معالجته، فسيبلغك TypeScript بوجود خطأ.
function area(shape: Shape): number {
  switch (shape.kind) {
    case 'circle': return Math.PI * shape.radius ** 2;
    case 'square': return shape.side ** 2;
    default:
      const _exhaustive: never = shape;
      throw new Error('Unhandled shape');
  }
}

نمط Result

تُعد الاتحادات المميّزة مثالية لنمط Result، إذ تتيح إرجاع بيانات نجاح أو خطأ من دون إطلاق استثناء.
type Ok<T> = { ok: true; value: T };
type Err = { ok: false; error: string };
type Result<T> = Ok<T> | Err;

نمط Action (على طريقة Redux)

في Redux والأنظمة المشابهة، تكون الإجراءات اتحادات مميّزة. ويكون الحقل `type` هو الخاصية المميّزة.
type Action =
  | { type: 'INCREMENT'; amount: number }
  | { type: 'DECREMENT'; amount: number }
  | { type: 'RESET' };

خصائص مميّزة متعددة

لا يلزم أن تكون الخاصية المميّزة خاصية واحدة؛ إذ يمكن لـ TypeScript التضييق بناءً على أي مجموعة من عمليات التحقق.
type AdminUser = { role: 'admin'; permissions: string[] };
type RegularUser = { role: 'user'; credits: number };
type User = AdminUser | RegularUser;

الاتحادات غير المميّزة قابلة للتضييق أيضًا

حتى من دون خاصية مميّزة، يضيّق TypeScript الاتحادات باستخدام typeof وinstanceof وعمليات التحقق من الخصائص.
type StringOrArr = string | string[];
function flatten(val: StringOrArr): string[] {
  return Array.isArray(val) ? val : [val];
}

الاتحادات المميّزة مقابل تسلسلات الفئات

تُعد الاتحادات المميّزة بديلًا وظيفيًا لتوريث الفئات عند نمذجة الأنواع المختلفة. وهي أبسط، وقابلة للتسلسل، وتعمل جيدًا مع مطابقة الأنماط.

من الواقع العملي: اتحاد استجابة HTTP

نمذج حالات استجابة API المختلفة باعتبارها اتحادًا مميّزًا.
type ApiState<T> =
  | { status: 'loading' }
  | { status: 'success'; data: T }
  | { status: 'error'; message: string };

تحقق سريع

ما الذي يجب أن يمتلكه كل عضو في اتحاد مميّز حتى يضيّق TypeScript النوع بشكل صحيح؟

مراجعة

تستخدم الاتحادات المميّزة خاصية حرفية مشتركة باعتبارها خاصية مميّزة. ضيّق النوع باستخدام switch/case، وأضف فحص اكتمال باستخدام never لاكتشاف الحالات غير المعالجة. وهي مثالية لآلات الحالات والإجراءات واستجابات API.
البدء مجانًا

تعلم TypeScript مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
101
الدروس
352

الأسئلة الشائعة

هل درس «اتحادات الأنواع المميّزة لمطابقة الأنماط بأمان» مجاني؟

نعم — نص درس «اتحادات الأنواع المميّزة لمطابقة الأنماط بأمان» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة TypeScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة TypeScript Academy 4 دروس في المجموع.

ماذا ستتعلم في «اتحادات الأنواع المميّزة لمطابقة الأنماط بأمان»؟

أضيفوا حقلًا حرفيًا مشتركًا إلى أعضاء الاتحاد لضمان أمان الأنواع تتمرن على TypeScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ TypeScript Academy؟

لا تُشترط خبرة سابقة. TypeScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «اتحادات الأنواع المميّزة لمطابقة الأنماط بأمان»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس TypeScript Academy هذا؟

نعم. كل درس في TypeScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. أنواع الاتحاد: A أو B
  2. أنواع التقاطع: A وB
  3. اتحادات الأنواع المميّزة لمطابقة الأنماط بأمان
  4. أنماط عملية باستخدام الاتحاد والتقاطع
← العودة إلى TypeScript Academy