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>). ودلالات النوعين مختلفة فلا تخلط بينهما اعتباطًا.