دمج typeof وkeyof
اشتقوا أنواعًا دقيقة بربط عوامل الأنواع
دمج typeof وkeyof درس مجاني في TypeScript Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في TypeScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة TypeScript Academy 4 دروس في المجموع.
المزيج القوي
يشتق typeof نوعًا من قيمة، بينما يسرد keyof مفاتيح نوع ما. وبجمعهما — keyof typeof value — تحصل على اتحاد من المفاتيح الفعلية للقيمة، ما يتيح وصولًا آمنًا نوعيًا بالكامل.
استخدام keyof typeof عمليًا
ابدأ بكائن ثابت، والتقط نوعه باستخدام typeof، ثم اسرد مفاتيحه باستخدام keyof. والنتيجة اتحاد من أسماء مفاتيح الكائن الحرفية.
const colors = { red: "#f00", green: "#0f0" }
type ColorKey = keyof typeof colors // "red" | "green"
const k: ColorKey = "red"
console.log(colors[k])سبب وجود هذا النمط
غالبًا ما يكون لديك كائن في وقت التشغيل دون واجهة منفصلة. يمنحك keyof typeof نوعًا للمفاتيح دون تكرار بنية الكائن في نوع مكتوب يدويًا.
const status = { active: 1, inactive: 0, pending: 2 }
type Status = keyof typeof status // "active" | "inactive" | "pending"
const s: Status = "pending"
console.log(status[s]) // 2وصول آمن نوعيًا باستخدام مفتاح
يرفض وسيط دالة مكتوب كـ keyof typeof obj المفاتيح غير الصالحة في وقت الترجمة، لذلك يكون الوصول المفهرس داخله آمنًا بالضرورة.
const rates = { usd: 1, eur: 1.1, gbp: 1.3 }
function rate(currency: keyof typeof rates): number {
return rates[currency]
}
console.log(rate("eur")) // 1.1
// rate("jpy") // Error: not a keyكائنات ثابتة شبيهة بالتعدادات
هذا اصطلاح شائع: عرّف كائنًا باستخدام as const ليحاكي التعداد، ثم اشتق منه نوعي المفتاح والقيمة.
const Direction = { Up: "UP", Down: "DOWN" } as const
type DirKey = keyof typeof Direction // "Up" | "Down"
type DirValue = typeof Direction[keyof typeof Direction] // "UP" | "DOWN"
console.log(Direction.Up)المفاتيح في مقابل القيم
لاحظ الفرق: يمنحك keyof typeof obj أسماء المفاتيح، بينما يمنحك typeof obj[keyof typeof obj] أنواع القيم. اختر ما تحتاج إليه واجهة برمجة التطبيقات لديك.
const sizes = { sm: 8, md: 16, lg: 24 } as const
type SizeName = keyof typeof sizes // "sm" | "md" | "lg"
type SizeValue = typeof sizes[keyof typeof sizes] // 8 | 16 | 24
const v: SizeValue = 16
console.log(v)الدالة العامة getProperty
تقيّد دالة getter الكلاسيكية الآمنة نوعيًا وسيط المفتاح باستخدام K extends keyof T، وتُرجع T[K]، لذلك يطابق نوع النتيجة نوع الخاصية التي جرى البحث عنها تمامًا.
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key]
}
const user = { id: 1, name: "Ada" }
const name = getProperty(user, "name") // string
console.log(name)يتبع نوع الإرجاع المفتاح
بما أن الإرجاع هو T[K]، يتكيف نوع نتيجة كل استدعاء مع المفتاح المحدد المُمرَّر إليه — فيكون رقمًا لمفتاح، وسلسلة نصية لمفتاح آخر.
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key]
}
const u = { id: 1, name: "Ada" }
const id = getProperty(u, "id") // number
const nm = getProperty(u, "name") // string
console.log(id, nm)رَفض المفاتيح غير الصالحة
يؤدي تمرير مفتاح غير موجود في الكائن إلى خطأ في الترجمة. يفرض القيد العام ذلك قبل أن يُنفَّذ الكود أصلًا.
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key]
}
const u = { id: 1 }
// getProperty(u, "missing") // Error: not a key of u
console.log(getProperty(u, "id"))دالة setter آمنة نوعيًا
تتيح الآلية نفسها إنشاء دالة setter: فنوع وسيط القيمة هو T[K]، ولذلك لا يمكنك إسناد إلا قيمة من النوع الصحيح لذلك المفتاح.
function setProperty<T, K extends keyof T>(obj: T, key: K, value: T[K]): void {
obj[key] = value
}
const u = { id: 1, name: "Ada" }
setProperty(u, "name", "Leo")
console.log(u.name)جمع الأجزاء
يمنحك نمط keyof typeof مع الوصول العام T[K] أدوات مساعدة آمنة وقابلة لإعادة الاستخدام للعمل على كائنات فعلية — وهي الأساس لقارئات الإعدادات المكتوبة نوعيًا، وعمليات البحث، وأدوات النماذج.
const theme = { primary: "#007", danger: "#f00" } as const
function color(name: keyof typeof theme): string {
return theme[name]
}
console.log(color("danger")) // #f00تحقق سريع
اختبر مدى فهمك للجمع بين typeof وkeyof.
مراجعة
يشتق keyof typeof value اتحادًا من المفاتيح الفعلية لقيمة ما دون كتابة واجهة منفصلة، ما يجعل الوصول المفهرس آمنًا نوعيًا. ميّز بين أنواع المفاتيح (keyof typeof obj) وأنواع القيم (typeof obj[keyof typeof obj]). يُرجع النمط العام getProperty<T, K extends keyof T>(obj, key): T[K] النوع الذي جرى البحث عنه تمامًا، ويرفض المفاتيح غير الصالحة في وقت الترجمة.
تعلم TypeScript مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 101
- الدروس
- 352
الأسئلة الشائعة
هل درس «دمج typeof وkeyof» مجاني؟
نعم — نص درس «دمج typeof وkeyof» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة TypeScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة TypeScript Academy 4 دروس في المجموع.
ماذا ستتعلم في «دمج typeof وkeyof»؟
اشتقوا أنواعًا دقيقة بربط عوامل الأنواع تتمرن على TypeScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ TypeScript Academy؟
لا تُشترط خبرة سابقة. TypeScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «دمج typeof وkeyof»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس TypeScript Academy هذا؟
نعم. كل درس في TypeScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- عامل النوع typeof
- عامل النوع keyof
- أنواع الوصول المفهرس
- دمج typeof وkeyof