🔷 شرح TypeScript

الأنواع المساعدة و keyof

ما الأنواع المساعدة؟

أنواع جاهزة من TypeScript تحوّل نوعًا موجودًا إلى نوع جديد دون إعادة كتابته. لنفترض هذا النوع:

interface User {
  id: number;
  name: string;
  email: string;
}

Partial — كل الخصائص اختيارية

function updateUser(id: number, changes: Partial<User>) {
  // changes قد يحتوي بعض حقول User فقط
}
updateUser(1, { name: "اسم جديد" });   // صحيح

Required — كل الخصائص مطلوبة

عكس Partial — يجعل الاختياري إلزاميًّا.

Pick — اختيار حقول محدّدة

type UserPreview = Pick<User, "id" | "name">;
// { id: number; name: string }

Omit — استبعاد حقول

type UserWithoutEmail = Omit<User, "email">;
// { id: number; name: string }

Readonly — منع التعديل

const u: Readonly<User> = { id: 1, name: "علي", email: "a@b.com" };
u.name = "آخر";   // خطأ! readonly

Record — كائن بمفاتيح وقيم محدّدة النوع

type Roles = Record<string, boolean>;
const perms: Roles = { admin: true, editor: false };

// أو بمفاتيح محدّدة
type Page = "home" | "about";
const titles: Record<Page, string> = {
  home: "الرئيسية",
  about: "من نحن",
};

المعامل keyof

ينتج اتحاد مفاتيح نوع ما:

type UserKeys = keyof User;   // "id" | "name" | "email"

function getField(user: User, key: keyof User) {
  return user[key];
}

جدول سريع

النوعالوظيفة
Partial<T>كل الحقول اختيارية
Required<T>كل الحقول مطلوبة
Pick<T, K>حقول محدّدة فقط
Omit<T, K>كل الحقول عدا المحدّدة
Readonly<T>منع التعديل
Record<K, V>كائن بمفاتيح/قيم منمَّطة

أخطاء شائعة

  • إعادة كتابة نوع معدّل يدويًّا بدل استخدام Partial/Omit.
  • الخلط بين Pick (يبقي) وOmit (يستبعد).

🎯 التالي: حُرّاس الأنواع (Type Guards) والتضييق.