0Pricing
TypeScript Academy · درس

توقيعات الفهارس مقابل Record

اختاروا بين توقيعات الفهارس ونوع الأداة Record

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

طريقتان لتعيين نوع الخريطة

يوفر TypeScript طريقتين شائعتين لوصف القاموس: توقيع الفهرسة مثل { [k: string]: V }، ونوع الأدوات المضمّن Record<K, V>. وتتداخل الطريقتان كثيرًا، لكن صياغة كل منهما مختلفة.

نوع الأدوات Record

ينشئ Record<K, V> نوع كائن تكون مفاتيحه من النوع K وقيمه من النوع V. وعند استخدام string للمفتاح، يكون مكافئًا لتوقيع فهرسة نصي.

type Scores = Record<string, number>
const game: Scores = { alice: 10, bob: 7 }
console.log(game.alice)

مكافئ لتوقيع الفهرسة

يصف هذان النوعان البنية نفسها. ويُعد كل من Record<string, number> و{ [key: string]: number } قابلًا للاستخدام بالتبادل مع المفاتيح النصية العشوائية.

type A = Record<string, number>
type B = { [key: string]: number }
const a: A = { x: 1 }
const b: B = a // assignable both ways
console.log(b.x)

Record مع اتحاد مفاتيح حرفية

تظهر القوة الحقيقية لـ Record عند استخدام اتحاد محدود من المفاتيح الحرفية. فهو ينشئ كائنًا يكون فيه كل مفتاح مُدرج مطلوبًا — وهو أمر لا يستطيع توقيع الفهرسة التعبير عنه.

type Role = "admin" | "editor" | "viewer"
type Perms = Record<Role, boolean>
const p: Perms = { admin: true, editor: true, viewer: false }
console.log(p.admin)

اكتشاف المفاتيح المفقودة

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

type Role = "admin" | "editor" | "viewer"
// const bad: Record<Role, boolean> = { admin: true, editor: true }
// Error: property viewer is missing

يسمح توقيع الفهرسة بأي مفتاح

وعلى النقيض، يكون توقيع الفهرسة مفتوح النهاية. يمكنكم إضافة مفاتيح لم يُذكر أي منها في أي موضع، ولا يُشترط وجود أي مفتاح.

type Open = { [key: string]: number }
const o: Open = {}      // no keys required
o.anything = 1          // any key allowed
console.log(o.anything)

مجموعات المفاتيح المحدودة: فضّلوا Record

عندما تكون المفاتيح مجموعة معروفة ومحدودة، يكون استخدام Record مع اتحاد حرفي أوضح وأكثر أمانًا. فهو يوثّق المفاتيح الموجودة بالضبط ويفرض اكتمالها.

type Direction = "north" | "south" | "east" | "west"
type Moves = Record<Direction, number>
const m: Moves = { north: 1, south: 0, east: 2, west: 0 }
console.log(m.east)

مجموعات المفاتيح المفتوحة: كلاهما مناسب

عندما تكون المفاتيح غير محدودة ويُكتشف محتواها في وقت التشغيل، يعمل كل من Record<string, V> وتوقيع الفهرسة. تختار فرق كثيرة Record للاختصار، بينما تختار فرق أخرى توقيع الفهرسة للوضوح والتصريح الصريح.

type Cache1 = Record<string, string>
type Cache2 = { [url: string]: string }
const c: Cache1 = {}
c["/home"] = "<html>"
console.log(c["/home"])

Record ليس سوى نوع مُحوَّل

يُعرَّف Record<K, V> من وراء الكواليس على أنه نوع مُحوَّل: { [P in K]: V }. ويساعدكم فهم ذلك على تفسير سبب إنتاج الاتحاد الحرفي لمفاتيح مطلوبة، بينما ينتج string توقيع فهرسة.

// lib definition (simplified):
// type Record<K extends string | number | symbol, V> = { [P in K]: V }
type Flags = Record<"a" | "b", boolean>
const f: Flags = { a: true, b: false }
console.log(f.a)

مفاتيح مسماة مع مفتاح شامل

يمكن لتوقيع الفهرسة أن يجمع بين مفتاح شامل ومفاتيح ثابتة في واجهة واحدة — وهذا مفيد عندما تحتاجون إلى كليهما. أما Record وحده فلا يستطيع الجمع بين المفاتيح المسماة المطلوبة والمفتاح الشامل المفتوح بهذه السلاسة.

interface Response {
  status: number
  [header: string]: number | string
}
const r: Response = { status: 200, "x-id": "abc" }
console.log(r.status)

الاختيار عمليًا

قاعدة عامة: المفاتيح المحدودة والمعروفة → استخدموا Record<Union, V> للتحقق من الاكتمال. المفاتيح غير المحدودة → كلا الشكلين مناسب. المفاتيح المسماة مع مفتاح شامل → استخدموا توقيع فهرسة داخل واجهة.

type Status = "ok" | "error"
type Messages = Record<Status, string>
const msg: Messages = { ok: "done", error: "failed" }
console.log(msg.ok)

تحقق سريع

اختبروا فهمكم للفرق بين Record وتوقيعات الفهرسة.

مراجعة

يعادل Record<string, V> توقيع فهرسة نصيًا، لكن استخدام Record مع اتحاد مفاتيح حرفية يجعل كل مفتاح مُدرج مطلوبًا، فيكشف المفاتيح المحذوفة وقت الترجمة. استخدموا Record<Union, V> للمفاتيح المحدودة المعروفة، وأيًّا من الشكلين للمفاتيح غير المحدودة، وتوقيع الفهرسة عندما تحتاجون إلى مفاتيح مسماة مع مفتاح شامل. ومن وراء الكواليس، يُعد Record النوع المُحوَّل { [P in K]: V }.

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

هل درس «توقيعات الفهارس مقابل Record» مجاني؟

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

ماذا ستتعلم في «توقيعات الفهارس مقابل Record»؟

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

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

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

كم من الوقت يستغرق درس «توقيعات الفهارس مقابل Record»؟

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

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

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

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

  1. تعريف توقيعات الفهارس
  2. توقيعات فهارس السلاسل مقابل الأرقام
  3. دمج المفاتيح المعروفة والديناميكية
  4. توقيعات الفهارس مقابل Record
← العودة إلى TypeScript Academy