الانتقال إلى المحتوى الرئيسي
الوحدة 2 · الدرس 1 من 23/14 في الدورة~12 min
دروس الوحدة (1/2)

اكتب الأسماء المستعارة مقابل الواجهات

في TypeScript، يمكننا تحديد بنية الكائنات المعقدة بطريقتين أساسيتين: استخدام الواجهات (interface) أو كتابة الأسماء المستعارة (type). كلاهما يعمل على وصف "شكل" الكائن أو بنية البيانات، لكن لديهما بعض الاختلافات الأساسية.


الواجهات (interface)

تحدد الواجهة عقدًا لبنية الكائن. إنها الأداة القياسية لوصف أشكال الكائنات وواجهات برمجة التطبيقات العامة بطريقة قابلة للتوسعة.

TS
interface Book {
  title: string;
  pages: number;
  author?: string; // Optional property (can be omitted)
}

const myBook: Book = {
  title: 'The Lord of the Rings',
  pages: 1200,
};

تشير علامة الاستفهام (?) إلى الخاصية باعتبارها اختيارية. الكائن myBook صالح حتى إذا أغفل الخاصية author.


اكتب الأسماء المستعارة (type)

يسمح لك الاسم المستعار للنوع بربط اسم جديد بأي نوع موجود، بما في ذلك الأنواع البدائية، أو الاتحادات، أو المجموعات، أو بنيات الكائنات بأكملها.

TS
type Point = {
  x: number;
  y: number;
};

const coordinates: Point = { x: 10, y: 20 };

الاختلافات الرئيسية: دمج التمديد والإعلان

على الرغم من أن interface وtype قابلان للتبديل في معظم حالات الاستخدام العادية، إلا أنهما يظهران اختلافين حاسمين:

1. القابلية للتوسعة (الميراث)

يتم توسيع الواجهات باستخدام الكلمة الأساسية extends:

TS
interface User {
  username: string;
}

interface Admin extends User {
  privileges: string[];
}

لا يمكن توسيع الأسماء المستعارة للنوع باستخدام extends، ولكن يمكن دمجها باستخدام عامل التشغيل التقاطع (&):

TS
type User = {
  username: string;
};

type Admin = User & {
  privileges: string[];
};

2. إعلان الدمج

يتم دمج الواجهات المتعددة التي تحمل نفس الاسم في نفس النطاق تلقائيًا بواسطة المترجم:

TS
interface User {
  name: string;
}
interface User {
  email: string;
}
// Now User has both 'name' and 'email'!

هذا السلوك غير مدعوم من خلال الأسماء المستعارة للنوع: الإعلان عن نفس type مرتين سيؤدي إلى حدوث خطأ في وقت الترجمة.


جربه بنفسك

التمرين 1: واجهة المستخدم

تمرين#ts.m2.l1.e1
المحاولات: 0جارٍ التحميل…

حدد واجهة باسم المستخدم تصف كائن المستخدم. يجب أن تحتوي الواجهة على: المعرف كرقم، واسم المستخدم كسلسلة، والبريد الإلكتروني كسلسلة اختيارية.

جارٍ تحميل المحرر…
إظهار التلميح

استخدم جملة البريد الإلكتروني؟: سلسلة لوضع علامة عليها كاختيارية.

الحل متاح بعد 3 من المحاولات

التمرين 2: الاسم المستعار لنوع Point2D

تمرين#ts.m2.l1.e2
المحاولات: 0جارٍ التحميل…

قم بإنشاء اسم مستعار من النوع المسمى Point2D يمثل نقطة ثنائية الأبعاد بإحداثيات x وy (كلا الرقمين).

جارٍ تحميل المحرر…
إظهار التلميح

استخدم نوع بناء الجملة Point2D = { x: number; ص: رقم؛ };

الحل متاح بعد 3 من المحاولات

التمرين 3: توسيع الواجهات

تمرين#ts.m2.l1.e3
المحاولات: 0جارٍ التحميل…

حدد واجهة باسم المنتج بالمعرف (الرقم) والسعر (الرقم). بعد ذلك، قم بتعريف واجهة باسم DiscountedProduct التي تعمل على توسيع المنتج وإضافة خاصية اختيارية تسمى DiscountCode (سلسلة).

جارٍ تحميل المحرر…
إظهار التلميح

استخدم المنتج الممتد لوراثة الحقول وإضافة رمز الخصم؟: سلسلة.

الحل متاح بعد 3 من المحاولات

التمرين 4: تكوين الخادم

تمرين#ts.m2.l1.e4
المحاولات: 0جارٍ التحميل…

قم بتعريف نوع الاسم المستعار المسمى ServerConfig الذي يمثل كائن تكوين للخادم. يجب أن يحتوي على: مضيف (سلسلة)، ومنفذ (رقم)، وuseHttps كحقل منطقي اختياري.

جارٍ تحميل المحرر…
إظهار التلميح

استخدم نوع بناء الجملة ServerConfig = { host: string; المنفذ: رقم؛ useHttps?: boolean; }.

الحل متاح بعد 3 من المحاولات