?: / 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 تكراريًا تكتبه بنفسك.