Record<K, V>

آخر تحديث: 2026-10-22

Record<K, V> Record

يبني Record<K, V> نوع كائن «مفاتيحه K وقيمه V». ويمكن أن يكون K اتحادًا حرفيًا (جداول التعداد) أو string/number (كائنات ذاكرة تخزين مفتوحة). وبالمقارنة مع كتابة تواقيع الفهرسة يدويًا، يعلن Record نوعي المفتاح والقيمة في مكان واحد ويُعاد استخدامهما في كل مكان.

المجموعةالأنواع المساعدة
النوعنوع
الوضع الصارمغير مطلوب

ℹ️ معلومة يحوّل المحرر لغة TypeScript إلى JavaScript ثم يشغّلها (بدون فحص أنواع)؛ راجع ناتج كل مثال لنتيجة فحص الأنواع.

📝 الصيغة

type Record<K extends string | number | symbol, V> = {
  [P in K]: V;
};

// الاستخدام
type Timeout = Record<"dev" | "staging" | "prod", number>;
type Cache = Record<string, number>;

⚙️ المعاملات

Kنوع المفتاح: الاتحاد الحرفي يجعل كل مفتاح واجبًا؛ أما string/number/symbol فتعطي مجموعة مفاتيح مفتوحة
Vنوع القيمة المشترك بين كل المفاتيح

القيمة المُعادة:نوع مُسَنَّد: مدخل لكل عضو من أعضاء K، وجميع قيمه من النوع V.

▶ مثال

عدّل الكود أدناه واضغط «جرّب» لرؤية نتيجة التحويل:

الناتج:

15000 3000
128

(مخرجات التشغيل بعد الترجمة؛ يشترط Record<Env, number> اكتمال المفاتيح الثلاثة — وإغفال staging يعطي error TS2739)

💡 نقاط مهمة

ℹ️ معلومة التطبيق: type Record<K, V> = { [P in K]: V } — النوع المُعَيَّن يحوّل كل مفتاح من مفاتيح K إلى V. لذا تشترط Record<"a"|"b", number> وجود a وb كليهما.
⚠️ تنبيه الوصول في Record<string, V> إلى أي مفتاح يعيد V لا V | undefined (بينما قد لا يوجد هذا المفتاح فعلًا). في وضع strict يمكنك تفعيل noUncheckedIndexedAccess ليضيف undefined إلى نتائج الوصول المفهرس، وهو أقرب إلى الواقع.
💡 تلميح لعكس «تبديل المفاتيح والقيم» أو اشتقاق اتحاد مفاتيح من كائن: keyof typeof obj يعطي اتحاد المفاتيح، وRecord<keyof typeof obj, NewValue> يبني جدولًا متماثلًا — وهو مفيد لربط قيم التعداد بنصوص العرض.
المزيد من الحالات قادم قريبًا.

📚 دروس ذات صلة

❓ أسئلة شائعة

س ما الفرق بين Record<K, V> وتوقيع الفهرسة { [key: string]: V }؟
ج عندما يكون K اتحادًا حرفيًا يفرض Record حضور كل مفتاح (فحص اكتمال) لا يملكه توقيع الفهرسة؛ وفي حالة K من نوع string يتكافأ النوعان. استخدم Record مع اتحاد حرفي عندما يهم اكتمال المفاتيح.
س هل يمكن أن تختلف قيم Record من مفتاح لآخر؟
ج يفرض Record قيمة V واحدة مشتركة. ولأشكال قيم لكل مفتاح استخدم نوعًا مُسَنَّدًا: { [K in Env]: { url: string; retries: number } }، أو أعلن interface ثم أعد استخدامها عبر Record<Env, Config>.
س هل يمكن استبدال Record بـ Map؟
ج اعتمدًا على الحالة: المفاتيح الثابتة والحاجة إلى التسلسل إلى JSON وفحص الاكتمال تُرجّح Record؛ ونمو المفاتيح ديناميكيًا والمفاتيح من أنواع عشوائية والإضافة/الحذف المتكرر تُرجّح Map (Map<string, number>). ودلالات النوعين مختلفة فلا تخلط بينهما اعتباطًا.
Web-Tutorial.com

فريق Web-Tutorial التقني

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

100%