أنواع الاتحاد والتقاطع في TypeScript

توفر TypeScript ميزات قوية لنظام النوع تساعدك على كتابة كود أكثر أمانًا وقابلية للتنبؤ. ومن بين هذه الميزات أنواع الاتحاد والتقاطع، والتي توفر المرونة في تعريف وإدارة الأنواع المعقدة. تقدم هذه المقالة هذه المفاهيم وتقدم أمثلة لتوضيح استخدامها.

ما هي أنواع الاتحاد؟

تسمح أنواع الاتحاد للمتغيرات بحمل قيم من أنواع مختلفة. وهذا مفيد عندما تحتاج إلى تمثيل قيمة يمكن أن تكون أحد أنواع متعددة. يتم الإشارة إلى أنواع الاتحاد باستخدام الرمز | (الأنبوب).

تعريف أنواع الاتحاد

لتحديد نوع الاتحاد، قم بتحديد أنواع متعددة مفصولة بالرمز |:

let value: string | number;

value = "Hello, TypeScript"; // Valid
value = 42; // Valid
value = true; // Error: Type 'boolean' is not assignable to type 'string | number'

في هذا المثال، يمكن أن يكون المتغير value إما string أو number، ولكن ليس boolean.

استخدام أنواع الاتحاد في الوظائف

تُعد أنواع الاتحاد مفيدة بشكل خاص في الوظائف حيث يمكن أن تكون المعلمات أو أنواع الإرجاع أنواعًا متعددة:

function formatValue(value: string | number): string {
  if (typeof value === "string") {
    return value.toUpperCase();
  } else {
    return value.toFixed(2);
  }
}

console.log(formatValue("hello")); // Output: HELLO
console.log(formatValue(123.456)); // Output: 123.46

تأخذ الدالة formatValue معلمة يمكن أن تكون string أو number وتنسيقها وفقًا لذلك.

ما هي أنواع التقاطعات؟

تتيح لك أنواع التقاطع الجمع بين أنواع متعددة في نوع واحد. وهذا يعني أن قيمة نوع التقاطع ستلبي جميع الأنواع في التقاطع. يتم الإشارة إلى أنواع التقاطع باستخدام الرمز & (علامة الجمع).

تحديد أنواع التقاطعات

لتحديد نوع التقاطع، قم بتحديد أنواع متعددة مفصولة بالرمز &:

interface Person {
  name: string;
}

interface Employee {
  employeeId: number;
}

type EmployeePerson = Person & Employee;

const john: EmployeePerson = {
  name: "John Doe",
  employeeId: 1234
};

console.log(john.name); // Output: John Doe
console.log(john.employeeId); // Output: 1234

في هذا المثال، يجمع النوع EmployeePerson بين واجهتي Person وEmployee، مما يؤدي إلى نوع يحتوي على الخاصيتين name وemployeeId.

استخدام أنواع التقاطع في الدوال

يمكن أيضًا استخدام أنواع التقاطع في الوظائف لتتطلب خصائص نوع متعددة:

function printEmployeeDetails(employee: Person & Employee): void {
  console.log(`Name: ${employee.name}`);
  console.log(`Employee ID: ${employee.employeeId}`);
}

const jane: EmployeePerson = {
  name: "Jane Smith",
  employeeId: 5678
};

printEmployeeDetails(jane);
// Output:
// Name: Jane Smith
// Employee ID: 5678

تتطلب وظيفة printEmployeeDetails وسيطة تلبي كلا النوعين Person وEmployee.

الجمع بين أنواع الاتحاد والتقاطع

يمكنك الجمع بين أنواع الاتحاد والتقاطع لإنشاء تعريفات أنواع معقدة:

type Shape = Circle | Rectangle;

interface Circle {
  kind: "circle";
  radius: number;
}

interface Rectangle {
  kind: "rectangle";
  width: number;
  height: number;
}

function getArea(shape: Shape): number {
  if (shape.kind === "circle") {
    return Math.PI * shape.radius * shape.radius;
  } else {
    return shape.width * shape.height;
  }
}

const myCircle: Circle = { kind: "circle", radius: 10 };
const myRectangle: Rectangle = { kind: "rectangle", width: 20, height: 30 };

console.log(getArea(myCircle)); // Output: 314.159...
console.log(getArea(myRectangle)); // Output: 600

في هذا المثال، يكون النوع Shape عبارة عن اتحاد بين Circle وRectangle، وتتعامل الدالة getArea مع كلا النوعين وفقًا لذلك.

خاتمة

توفر أنواع الاتحاد والتقاطع في TypeScript طرقًا فعّالة لإدارة الأنواع ودمجها، مما يوفر المرونة والدقة في تعريفات الأنواع. تسمح أنواع الاتحاد للمتغير بأن يكون أحد عدة أنواع، بينما تجمع أنواع التقاطع بين أنواع متعددة في نوع واحد. باستخدام هذه الميزات، يمكنك إنشاء تطبيقات أكثر قوة وأمانًا للأنواع.

تدرب على استخدام أنواع الاتحاد والتقاطع لتعتاد على قدراتها وتحسين مهاراتك في برمجة TypeScript.