?: / readonly الخصائص الاختيارية والقراءة فقط

آخر تحديث: 2026-10-22

?: / readonly الخصائص الاختيارية والقراءة فقط

تعلّم ? الخاصية كاختيارية (يجوز أن تكون غائبة)، بينما تعلّم readonly الخاصية كقراءة فقط (لا يمكن إسناد قيمة جديدة بعد التهيئة). هذان أكثر مُعدِّلَين شيوعًا في خصائص الكائنات.

المجموعةتركيب الأنواع
النوعبناء الجملة
الوضع الصارمغير مطلوب

ℹ️ معلومة يحوّل المحرر لغة TypeScript إلى JavaScript ثم يشغّلها (بدون فحص أنواع)؛ راجع ناتج كل مثال لنتيجة فحص الأنواع.

📝 الصيغة

interface Config {
  readonly name: string; // للقراءة فقط: لا يمكن تغييره بعد الإسناد
  retries?: number;      // اختياري: قد يكون غائبًا
}

⚙️ المعاملات

?:علامة الاختيارية: يجوز إغفال هذه الخاصية في الكائن الحرفي
readonlyعلامة القراءة فقط: إعادة الإسناد بعد التهيئة تسبب خطأ ترجمة (وينطبق على المستوى الأول فقط)

القيمة المُعادة:لا قيمة مُعادة — المُعدِّلان مفهومان خاصان بطبقة الأنواع فقط ويختفيان بعد الترجمة.

▶ مثال

عدّل الكود أدناه واضغط «جرّب» لرؤية نتيجة التحويل:

الناتج:

shop localhost 8080

(مخرجات التشغيل بعد التحويل؛ كتابة config.appName = "x" تؤدي إلى خطأ ترجمة — فـ appName للقراءة فقط)

💡 نقاط مهمة

ℹ️ معلومة يتضمن نوع الخاصية الاختيارية undefined تلقائيًا: فـ retries?: number تكافئ في وضع strict التعبير retries?: number | undefined.
⚠️ تنبيه يمنع readonly إعادة الإسناد في مستواه الأول فقط: فالمصفوفة readonly arr: number[] تزال تقبل push، وحقول الكائنات المتداخلة تبقى قابلة للتعديل. استخدم Readonly<T> أو as const للقراءة فقط على مستوى العمق.
💡 تلميح عند قراءة خاصية اختيارية وفّر قيمة افتراضية عبر ?? (مثل config.port ?? 8080) بدل تناثر فحوص undefined في كود العمل.
المزيد من الحالات قادم قريبًا.

📚 دروس ذات صلة

❓ أسئلة شائعة

س ما الفرق بين readonly و const؟
ج يحمي const ربط المتغير (لا يمكن توجيهه إلى قيمة أخرى)، بينما يحمي readonly خاصية الكائن (لا يمكن إسناد قيمة جديدة للحقل). تبقى حقول const obj قابلة للتعديل ما لم تُعلَّم الحقول بـ readonly.
س هل يوجد فرق بين الخاصية الاختيارية وكتابة النوع T | undefined؟
ج نعم: علامة ? تعني "يجوز أن تكون الخاصية غائبة كليًا"؛ بينما a?: T | undefined تعني "يجب أن توجد لكن يجوز أن تكون قيمتها undefined". ويصبح التمييز صارمًا بعد تفعيل exactOptionalPropertyTypes.
س كيف أجعل الكائن كله (بما فيه المتداخل) للقراءة فقط؟
ج يقتصر أثر Readonly<T> على المستوى الأول؛ وللقراءة فقط على العمق استخدم as const (يقفل القيم إلى الحرفيات) أو نوع DeepReadonly تكراريًا تكتبه بنفسك.
Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%