🔷 شرح TypeScript

أنواع الكائنات (Object Types)

وصف شكل الكائن

نحدّد نوع كل خاصية داخل الكائن:

let user: { name: string; age: number } = {
  name: "ليلى",
  age: 28,
};

user.age = 29;        // صحيح
user.age = "نص";     // خطأ!

الخصائص الاختيارية (؟)

نضيف ? للخاصية التي قد لا توجد:

let product: { name: string; discount?: number } = {
  name: "كتاب",
  // discount غير مطلوب
};

خصائص للقراءة فقط (readonly)

let config: { readonly apiKey: string } = {
  apiKey: "abc123",
};
config.apiKey = "xyz";   // خطأ! readonly

تواقيع الفهرسة (Index Signatures)

عندما لا نعرف أسماء المفاتيح مسبقًا لكن نعرف نوع المفاتيح والقيم:

let scores: { [subject: string]: number } = {};

scores["رياضيات"] = 90;
scores["علوم"] = 85;
scores["لغة"] = "ممتاز";   // خطأ! القيمة يجب أن تكون number

مفيد للقواميس الديناميكية:

let translations: { [key: string]: string } = {
  hello: "مرحبًا",
  bye: "وداعًا",
};

الكائنات المتداخلة

let order: {
  id: number;
  customer: { name: string; email: string };
} = {
  id: 1,
  customer: { name: "نور", email: "n@mail.com" },
};

أخطاء شائعة

  • نسيان ? لخاصية اختيارية فيشتكي TypeScript من نقصانها.
  • كتابة شكل كائن طويل مرارًا بدل تجميعه في type أو interface (الدرس القادم).

🎯 التالي: التعدادات (Enums) والأنواع الحرفية (Literal Types).