0Pricing
TypeScript Academy · درس

‏TupleToUnion وUnionToIntersection

حوّلوا برمجيًا بين الصفوف والاتحادات

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

TupleToUnion: المفهوم

يحوّل TupleToUnion<T> نوع tuple إلى union من أنواع عناصره، وهو عكس إنشاء tuple من أنواع منفردة.

type TupleToUnion<T extends readonly any[]> = T[number];
type A = TupleToUnion<[string, number, boolean]>; // string | number | boolean

كيفية عمل T[number]

تصل فهرسة tuple باستخدام number إلى جميع الفهارس الرقمية دفعة واحدة، وهو ما تعبّر عنه TypeScript على هيئة union من أنواع العناصر.

type Tuple = [string, number, boolean];
type Elements = Tuple[number]; // string | number | boolean

TupleToUnion مع as const

ادمجوه مع مصفوفات as const لاشتقاق unions من مصفوفات القيم.

const COLORS = ["red", "green", "blue"] as const;
type Color = typeof COLORS[number]; // "red" | "green" | "blue"

UnionToIntersection: المفهوم

يُعد تحويل union إلى intersection أصعب، ويتطلب أنواعًا شرطية موزّعة مع أنواع الدوال لجمع جميع الأعضاء.

type UnionToIntersection<U> =
  (U extends any ? (x: U) => void : never) extends (x: infer I) => void
    ? I
    : never;

لماذا تنجح حيلة الدالة؟

يغلّف التوزيع على أعضاء union كل عضو داخل نوع دالة. ثم تستنتج TypeScript تقاطع جميع أنواع المعاملات لتلبية القيد البنيوي.

type A = UnionToIntersection<{ a: 1 } | { b: 2 }>;
// { a: 1 } & { b: 2 }

UnionToTuple: مشكلة صعبة

يُعد تحويل union إلى tuple ممكنًا نظريًا، لكنه يعتمد على ترتيب التقييم، وهو أمر لا تضمنه TypeScript؛ لذلك تجنّبوه في بيئة الإنتاج.

// Not reliable — union member order is unspecified
// Use TupleToUnion (safe) not UnionToTuple (fragile)

استخدام عملي لـ TupleToUnion

استخرجوا جميع المفاتيح الصالحة من tuple من القيم الحرفية النصية لبناء نوع union للتحقق.

const ALLOWED_METHODS = ["GET", "POST", "PUT", "DELETE"] as const;
type HttpMethod = typeof ALLOWED_METHODS[number];
function request(method: HttpMethod) { /* ... */ }

استخدام عملي لـ UnionToIntersection

ادمجوا عدة واجهات mixin من union في نوع واحد مدمج.

type Mixin1 = { log(): void };
type Mixin2 = { save(): Promise<void> };
type Combined = UnionToIntersection<Mixin1 | Mixin2>;
// { log(): void } & { save(): Promise<void> }

تقاطع الأنواع البدائية

ينتج عن تقاطع أنواع بدائية غير مترابطة never، إذ لا يمكن لأي قيمة أن تكون string وnumber في الوقت نفسه.

type X = UnionToIntersection<string | number>; // never

استخدام هذه الأنواع في القيود العامة

ادمجوا TupleToUnion وUnionToIntersection داخل القيود العامة لبناء واجهات API مرنة وآمنة من ناحية الأنواع.

function merge<T extends object[]>(...args: T): UnionToIntersection<T[number]> {
  return Object.assign({}, ...args) as any;
}

مراجعة: Tuple ↔ Union ↔ Intersection

يستخدم TupleToUnion الفهرسة باستخدام T[number]. وتستخدم UnionToIntersection حيلة الدالة الموزّعة مع infer. ويُعد كلاهما من الأدوات الأساسية لمعالجة الأنواع المتقدمة.

تحقق سريع

ما نوع TupleToUnion<[string, number]>؟

ما تعلمتموه

يستخدم TupleToUnion الفهرسة الرقمية لاستخراج unions من العناصر في tuples. وتستخدم UnionToIntersection حيلة الدالة الموزّعة. وتُعد هذه الأنماط أساسية لمعالجة أنواع TypeScript المتقدمة.

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

هل درس «‏TupleToUnion وUnionToIntersection» مجاني؟

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

ماذا ستتعلم في «‏TupleToUnion وUnionToIntersection»؟

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

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

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

كم من الوقت يستغرق درس «‏TupleToUnion وUnionToIntersection»؟

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

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

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

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

  1. ‏DeepPartial وDeepReadonly
  2. أداتا Flatten وUnwrapPromise
  3. ‏TupleToUnion وUnionToIntersection
  4. نشر مكتبة أدوات الأنواع
← العودة إلى TypeScript Academy