0Pricing
TypeScript Academy · درس

تحديد أنواع خرائط الأحداث

اربطوا أسماء الأحداث بأنواع حمولاتها

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

ما خريطة الأحداث؟

خريطة الأحداث هي واجهة تربط كل اسم حدث بشكل حمولته. وهي المصدر الوحيد للحقيقة في نظام الأحداث.

interface Events {
  login: { userId: string };
  logout: void;
}
// "login" carries a payload; "logout" carries none.

ربط الأسماء بالحمولات

كل مفتاح خاصية هو اسم حدث، ونوع قيمته هو الحمولة. ويتيح ذلك لنظام الأنواع معرفة البيانات التي يتوقعها كل حدث بدقة.

interface Events {
  message: { text: string; from: string };
  typing: { userId: string };
}
const sample: Events["message"] = { text: "hi", from: "ada" };
console.log(sample.text, sample.from);

أحداث بلا حمولة

لا تحمل بعض الأحداث أي بيانات. نمذجها باستخدام void أو كائن فارغ للإشارة إلى عدم وجود شيء لتمريره.

interface Events {
  open: void;
  close: void;
}
// Handlers for these receive no meaningful argument.
console.log("payloadless events use void");

استخراج نوع اسم الحدث

استخدم keyof للحصول على اتحاد جميع أسماء الأحداث الصالحة من الخريطة، وهو أمر مفيد لتقييد معاملات الدوال.

interface Events {
  login: { userId: string };
  logout: void;
}
type EventName = keyof Events; // "login" | "logout"
const e: EventName = "login";
console.log(e);

البحث عن نوع الحمولة

افهرس الخريطة باستخدام اسم حدث للحصول على نوع حمولة ذلك الحدث: Events["login"] هو { userId: string }.

interface Events {
  login: { userId: string };
  logout: void;
}
type LoginPayload = Events["login"]; // { userId: string }
const p: LoginPayload = { userId: "u1" };
console.log(p.userId);

خريطة أحداث أكثر تفصيلًا

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

interface Events {
  cartAdd: { productId: string; qty: number };
  cartRemove: { productId: string };
  checkout: { total: number };
}
const a: Events["cartAdd"] = { productId: "p1", qty: 2 };
console.log(a.productId, a.qty);

يمكن أن تكون الحمولات اتحادات

يمكن أن يكون نوع الحمولة نفسه اتحادًا مميّزًا، مما يتيح لحدث واحد حمل عدة أشكال مترابطة.

interface Events {
  status:
    | { kind: "online" }
    | { kind: "offline"; since: number };
}
const s: Events["status"] = { kind: "offline", since: 100 };
console.log(s.kind);

إعادة استخدام أنواع الحمولات

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

type User = { id: string; name: string };
interface Events {
  userCreated: User;
  userDeleted: { id: string };
}
const u: Events["userCreated"] = { id: "1", name: "Ada" };
console.log(u.name);

لماذا تتفوق الخريطة على السلاسل النصية غير المقيّدة

من دون خريطة، تكون أسماء الأحداث سلاسل نصية مجردة، وتكون الحمولات من النوع any. أما الخريطة فتوفّر الإكمال التلقائي والتحقق وعقدًا واضحًا.

// Loose: emit("login", { usrId: "x" }) typo unnoticed, payload any
// Mapped: the interface forces the correct name and payload shape.
console.log("the map is the contract");

الخريطة تقود واجهة API

في الدروس التالية، ستكون emit وon عامتين بالنسبة إلى خريطة الأحداث، باستخدام keyof والوصول المفهرس للحفاظ على أمان الأنواع.

interface Events {
  login: { userId: string };
  logout: void;
}
type Name = keyof Events;
type PayloadOf<K extends Name> = Events[K];
const id: PayloadOf<"login"> = { userId: "u" };
console.log(id.userId);

مصدر واحد للحقيقة

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

interface Events {
  ping: { at: number };
}
const p: Events["ping"] = { at: Date.now() };
console.log(typeof p.at);

تحقق سريع: خرائط الأحداث

اختبر مدى فهمك لكتابة أنواع خرائط الأحداث.

مراجعة: كتابة أنواع خرائط الأحداث

تعلمت نمذجة الأحداث كواجهة تربط الأسماء بالحمولات، باستخدام void للأحداث التي لا تحمل حمولات، وkeyof للأسماء، والوصول المفهرس لأنواع الحمولات، وهي أساس نظام أحداث آمن من ناحية الأنواع.

interface Events { login: { userId: string }; logout: void }
type Name = keyof Events;
const n: Name = "logout";
console.log(n);

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

هل درس «تحديد أنواع خرائط الأحداث» مجاني؟

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

ماذا ستتعلم في «تحديد أنواع خرائط الأحداث»؟

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

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

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

كم من الوقت يستغرق درس «تحديد أنواع خرائط الأحداث»؟

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

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

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

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

  1. تحديد أنواع خرائط الأحداث
  2. emit وon الآمنان نوعيًا
  3. فئة باعث الأحداث العامة
  4. استنتاج وسائط المستمعين
← العودة إلى TypeScript Academy