0Pricing
TypeScript Academy · درس

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

افهموا قواعد المفاتيح الرقمية وخصائصها الخاصة

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

نوعا مفاتيح الفهرسة

يدعم TypeScript توقيعات فهرسة من النوعين string وnumber. تبدو متشابهة، لكنها تتصرف بشكل مختلف بسبب طريقة تخزين JavaScript لمفاتيح الكائنات فعليًا.

توقيع فهرسة رقمي

يصف توقيع الفهرسة الرقمي { [i: number]: T } الكائنات المفهرسة بمواضع رقمية — وبالأخص المصفوفات والبنى الشبيهة بالمصفوفات.

type NumberList = { [index: number]: string }

const names: NumberList = { 0: "ana", 1: "leo" }
console.log(names[0]) // ana

يحوّل JS المفاتيح الرقمية إلى نصوص

إليكم الحقيقة الأساسية: مفاتيح كائنات JavaScript تكون دائمًا نصوصًا. فعندما تكتبون obj[0]، يخزّن المحرك المفتاح فعليًا على أنه النص "0". ويعكس TypeScript هذه الحقيقة.

const obj: Record<string, string> = {}
obj[1] = "one"
console.log(obj["1"]) // one — same key!
console.log(Object.keys(obj)) // ["1"]

قاعدة التوافق

بما أن المفتاح الرقمي هو في الحقيقة مفتاح نصي من وراء الكواليس، يفرض TypeScript قاعدة مفادها أنه عندما يملك كائن ما توقيعَي فهرسة رقميًا ونصيًا معًا، يجب أن يكون نوع قيمة الفهرس الرقمي قابلاً للإسناد إلى نوع قيمة الفهرس النصي.

interface Mixed {
  [key: string]: string
  [index: number]: string // must match the string value type
}
const m: Mixed = { 0: "a", name: "b" }
console.log(m[0], m.name)

سبب وجود القاعدة

إذا كان obj[0] وobj["0"] يشيران إلى الخانة نفسها، فلا يمكن أن يكون نوع القيمة رقمًا في حالة ونصًا في الحالة الأخرى. لذلك يجب أن يكون نوع قيمة الفهرس الرقمي نوعًا فرعيًا من نوع قيمة الفهرس النصي للحفاظ على الاتساق.

// This is an ERROR:
// interface Bad {
//   [key: string]: string
//   [index: number]: number // number not assignable to string
// }

المفهرسة رقميًا: المصفوفات

المصفوفات هي النوع النموذجي للفهرسة الرقمية. إذ يملك النوع المضمّن Array<T> فعليًا توقيع فهرسة رقميًا، ولهذا تعيد arr[i] قيمة من النوع T.

const nums: number[] = [10, 20, 30]
const first: number = nums[0]
console.log(first + nums[2]) // 40

المجموعات أيضًا مفهرسة رقميًا

تبني المجموعات على الفهرسة الرقمية، لكنها تثبّت مواضع محددة لأنواع محددة. أما الوصول الرقمي خارج النطاق فيعود إلى اتحاد أنواع العناصر أو يُبلَّغ عنه كخطأ.

const pair: [string, number] = ["age", 30]
const label: string = pair[0]
const value: number = pair[1]
console.log(label + ": " + value)

الفهرسة النصية تتيح نوعي البحث

يقبل الكائن الذي يملك توقيع فهرسة نصيًا أيضًا الوصول الذي يبدو رقميًا، لأن الرقم يُحوَّل أولًا إلى مفتاح نصي.

type Bag = { [key: string]: number }
const b: Bag = {}
b[5] = 100        // stored as key "5"
console.log(b["5"]) // 100

الفهرسة الرقمية لا تقبل النصوص

لكن العكس غير صحيح. فالكائن المكتوب بتوقيع فهرسة رقمي فقط يرفض المفاتيح النصية وقت الترجمة، رغم أن JS سيسمح بها من الناحية التقنية.

type OnlyNumbers = { [i: number]: string }
const o: OnlyNumbers = { 0: "x" }
// o.name = "y" // Error: property name not on number-indexed type
console.log(o[0])

الاختيار بينهما

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

type Positions = { [i: number]: { x: number; y: number } }
type ByName = { [name: string]: { x: number; y: number } }
const p: Positions = { 0: { x: 1, y: 2 } }
console.log(p[0].x)

كائن مختلط عملي

يمكنكم الجمع بين التوقيعين عندما يكون نوع القيمة مناسبًا لكليهما — وهذا مفيد للحاويات المتناثرة الشبيهة بالمصفوفات التي تعرض أيضًا خانات مسماة.

interface Flexible {
  [key: string]: number
  [index: number]: number
}
const f: Flexible = { 0: 1, total: 99 }
console.log(f[0] + f.total) // 100

تحقق سريع

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

مراجعة

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

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

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

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

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

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

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

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

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

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

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

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

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

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