الاختلافات بين النوع والواجهة
دمج التصريحات (التوسعة):
تدعم الواجهات دمج التصريحات، ما يعني أنه يمكنك تعريف عدة واجهات بالاسم نفسه، وسيدمجها TypeScript في واجهة واحدة تحتوي على الخصائص والأساليب المجمّعة. وفي المقابل، لا تدعم الأنواع دمج التصريحات. يمكن أن يفيد ذلك عندما تريد إضافة وظائف إضافية أو تخصيص أنواع موجودة من دون تعديل التعريفات الأصلية أو ترقيع الأنواع المفقودة أو غير الصحيحة.
interface A { x: string;}interface A { y: string;}const j: A = { x: 'xx', y: 'yy',};توسيع أنواع/واجهات أخرى:
يمكن لكل من الأنواع والواجهات توسيع أنواع/واجهات أخرى، لكن الصياغة مختلفة. مع الواجهات، تستخدم الكلمة المفتاحية extends لوراثة الخصائص والأساليب من واجهات أخرى. ومع ذلك، لا يمكن لواجهة توسيع نوع مركّب مثل نوع الاتحاد.
interface A { x: string; y: number;}interface B extends A { z: string;}const car: B = { x: 'x', y: 123, z: 'z',};بالنسبة إلى الأنواع، تستخدم المعامل & لدمج عدة أنواع في نوع واحد (تقاطع).
interface A { x: string; y: number;}
type B = A & { j: string;};
const c: B = { x: 'x', y: 123, j: 'j',};أنواع الاتحاد والتقاطع:
تكون الأنواع أكثر مرونة عند تعريف أنواع الاتحاد والتقاطع. باستخدام الكلمة المفتاحية type، يمكنك بسهولة إنشاء أنواع اتحاد باستخدام المعامل | وأنواع تقاطع باستخدام المعامل &. وعلى الرغم من أن الواجهات يمكنها أيضًا تمثيل أنواع الاتحاد بصورة غير مباشرة، فإنها لا توفر دعمًا مضمّنًا لأنواع التقاطع.
type Department = 'dep-x' | 'dep-y'; // Union
type Person = { name: string; age: number;};
type Employee = { id: number; department: Department;};
type EmployeeInfo = Person & Employee; // Intersectionمثال باستخدام الواجهات:
interface A { x: 'x';}interface B { y: 'y';}
type C = A | B; // Union of interfaces