Kodokon kodokon.com

type مقابل interface: التوسيع بـ extends والتقاطع

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

8 دقيقة · 3 أسئلة

افتح هذا الدرس في Kodokon

أنت تعرف بالفعل كيفية التصريح عن أنواع الكائنات. لكن السؤال الحقيقي في أي مشروع هو الاختيار بين type وinterface، ثم تركيب الأنواع الموجودة دون تكرار الشيفرة. لنبدأ بالسيناريو الأكثر شيوعًا: نمذجة كيانات متشابهة في الشكل.

TYPESCRIPT
interface User {
  id: number;
  name: string;
}

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

const admin: Admin = {
  id: 1,
  name: "Ada",
  permissions: ["users:write"],
};
توسيع واجهة interface باستخدام extends

تنشئ extends علاقة واضحة: فالـAdmin هو User مزوّد بصلاحيات إضافية. ومع اسم مستعار من نوع type، تحصل على النتيجة نفسها عبر عامل التقاطع &، الذي يدمج عدة أشكال في شكل واحد. إنها الأداة المثالية للاهتمامات العرضية المشتركة، مثل الطوابع الزمنية الموجودة على جميع كياناتك.

TYPESCRIPT
type Timestamps = {
  createdAt: Date;
  updatedAt: Date;
};

type Product = {
  id: number;
  label: string;
};

type StoredProduct = Product & Timestamps;
تركيب الأنواع باستخدام عامل التقاطع &

إذن، أيهما ينبغي أن تختار؟ هناك فرقان مهمان بحق. أولًا، type وحده يستطيع تسمية اتحاد مثل 'active' | 'archived'. ثانيًا، تصريحان بـinterface يحملان الاسم نفسه يندمجان تلقائيًا: مفيد لتعزيز أنواع مكتبةٍ ما، وخطير حين يحدث بالصدفة.

TYPESCRIPT
type Status = "active" | "archived";

interface Config {
  locale: string;
}

interface Config {
  debug: boolean;
}

const config: Config = { locale: "fr", debug: true };
الاتحادات حصرية لـ type، وتصريحات interface تندمج

اختبار المعرفة

تأكّد من أنك تذكّرت النقاط الأساسية في هذا الدرس.

  1. تحتاج إلى تسمية النوع 'draft' | 'published'. أي بنية مطلوبة لذلك؟
    • interface
    • type
    • كلاهما يعمل
    • enum
  2. يتعايش تصريحان interface Config { ... } في النطاق نفسه. ماذا يحدث؟
    • خطأ ترجمة فوري
    • الثاني يستبدل الأول
    • يندمجان في واجهة interface واحدة
    • الأول له الأولوية
  3. أي عامل يجمع اسمين مستعارين لنوعي كائن في نوع واحد يتطلب خصائص كليهما؟
    • |
    • &
    • extends