[K in keyof T] أنواع المُعَيَّنة
آخر تحديث: 2026-10-22
[K in keyof T] أنواع المُعَيَّنة
أنواع المُعَيَّنة «تجتاز المفاتيح وتحوّل القيم»: [K in keyof T]: boolean تولّد لكل مفتاح K في T خاصية جديدة بالاسم نفسه. وهي خط الإنتاج لتغيير الأنواع بالجملة — فخيارية Partial وقراءة-فقط Readonly كلاهما نتيجة سطر مفاضلة واحد.
| المجموعة | الأنواع العامة |
|---|---|
| النوع | بناء الجملة |
| الوضع الصارم | غير مطلوب |
ℹ️ معلومة يحوّل المحرر لغة TypeScript إلى JavaScript ثم يشغّلها (بدون فحص أنواع)؛ راجع ناتج كل مثال لنتيجة فحص الأنواع.
📝 الصيغة
type BooleanFlags<T> = {
[K in keyof T]: boolean;
};
// تركيبات المعدِّلات: readonly يضيف عدم القابلية للتغيير، و -? يزيل الاختيارية
type MyReadonly<T> = { readonly [K in keyof T]: T[K] };
type Concrete<T> = { [K in keyof T]-?: T[K] };
⚙️ المعاملات
| [K in keyof T] | جملة التكرار: يرتبط K بكل مفتاح من مفاتيح T بالتسلسل |
|---|---|
| T[K] | تحويل القيمة: نوع الخاصية الجديدة، ويمكن إجراء عمليات عليه (boolean أو T[K] | null أو أنواع تغليف...) |
| readonly / ? / -? | المعدلات: يمكن إضافة أو إزالة readonly وعلامة الاختيارية ? أثناء المُعَيَّنة |
القيمة المُعادة:يعيد نوع المُعَيَّنة نوع كائن جديدًا: مجموعة مفاتيحه مطابقة لـ T (أو مُصفّاة ومُعاد تسميتها عبر as)، وأنواع قيمه تتحول وفق قواعد المُعَيَّنة.
▶ مثال
عدّل الكود أدناه واضغط «جرّب» لرؤية نتيجة التحويل:
الناتج:
{"dark":true,"beta":false,"newNav":true}
true false
(مخرجات التشغيل بعد التحويل؛ flags.dark تحصل على boolean وليس القيمة الحرفية الأصلية true — قاعدة المُعَيَّنة حولت كل حقل إلى boolean)
💡 نقاط مهمة
ℹ️ معلومة الأدوات المدمجة Partial وReadonly وPick وRecord كلها منفذة بأنواع المُعَيَّنة — فبفهم [K in keyof T] تفهم نصف فصل أنواع الأدوات.
💡 تلميح جملة as يمكنها إعادة تسمية المفاتيح أو تصفيتها: { [K in keyof T as NewKey<K>]: T[K] } تعيد التسمية بالقوالب الحرفية، و as never تحذف المفتاح مباشرةً — أسلوب متقدم لتغيير المفاتيح والقيم معًا.
⚠️ تنبيه المُعَيَّنة على keyof T متجانسة (تحفظ المعدلات الأصلية)، لكن المُعَيَّنة المباشرة على نوع الاتحاد (بأسلوب Record) لا تحفظ الاختيارية/قراءة-فقط — فإذا سألت «أين اختفت الـ ? الخاصة بي؟» فالإجابة غالبًا هذا الاختلاف.
🏷️ الأنواع العامة ذات صلة
💡 حالات ذات صلة
المزيد من الحالات قادم قريبًا.
📚 دروس ذات صلة
❓ أسئلة شائعة
س ما الفرق بين نوع المُعَيَّنة وتوقيع الفهرسة؟
ج توقيع الفهرسة [k: string]: T يصرح بأن «أي مفتاح من نوع T» دون تثبيت أسماء المفاتيح؛ أما المُعَيَّنة [K in keyof T] فتنسخ المفاتيح المعروفة واحدًا تلو الآخر بدقة لكل مفتاح. الأول واسع وشامل والثاني تحويل دقيق.
س هل يمكن المُعَيَّنة على بعض المفاتيح فقط؟
ج نعم: بالتصفية عبر as ([K in keyof T as K extends "id" ? never : K]) أو بإجراء Pick/Omit أولًا ثم المُعَيَّنة. وتقص مجموعة المفاتيح يحدث في جملة as.
س هل يمكن لنوع المُعَيَّنة أن ينتج دوال أو مصفوفات؟
ج نعم: { [K in keyof T]: (v: T[K]) => void } يولّد مجموعة استدعاءات راجعة؛ و { [K in keyof T]: T[K][] } يجعل كل حقل مصفوفة — فالتحويل في موضع القيمة غير محصور بالأنواع البسيطة.