Readonly<T>
آخر تحديث: 2026-10-22
Readonly<T> Readonly
يجعل Readonly<T> كل خصائص T للقراءة فقط: إعادة إسناد قيمة لخاصية بعد إنشاء الكائن خطأ في الترجمة مباشرة. وهو مناسب لكائنات الإعدادات واللقطات والثوابت المشتركة — بيانات «تُبنى مرة واحدة ولا يصح تغييرها». لاحظ أنه يقفل الخصائص، بينما يقفل const ربط المتغير — أمران مختلفان.
| المجموعة | الأنواع المساعدة |
|---|---|
| النوع | نوع |
| الوضع الصارم | غير مطلوب |
ℹ️ معلومة يحوّل المحرر لغة TypeScript إلى JavaScript ثم يشغّلها (بدون فحص أنواع)؛ راجع ناتج كل مثال لنتيجة فحص الأنواع.
📝 الصيغة
type Readonly<T> = {
readonly [K in keyof T]: T[K];
};
// الاستخدام
const config: Readonly<AppConfig> = { appName: "docs", port: 8080, debug: false };
// config.debug = true; // خطأ تصريف: Cannot assign to 'debug' because it is a read-only property
⚙️ المعاملات
| T | نوع الكائن المراد تحويله؛ يضيف النوع المُعَيَّن المُعدِّل readonly إلى كل خاصية |
|---|
القيمة المُعادة:نوع جديد: مجموعة خصائصه هي خصائص T نفسها، لكنها جميعًا موسومة readonly.
▶ مثال
عدّل الكود أدناه واضغط «جرّب» لرؤية نتيجة التحويل:
الناتج:
docs-site:8080
(مخرجات التشغيل بعد الترجمة؛ حماية القراءة فقط يضمنها tsc ساكنًا — إزالة التعليق عن ذلك السطر تعطي error TS2540، بينما لا يمنع JS المجرد الإسناد إطلاقًا)
💡 نقاط مهمة
ℹ️ معلومة التطبيق نوع مُسَنَّد: [K in keyof T] مسبوق بـ readonly. ويزول readonly كليًا بعد الترجمة — فلا توجد حماية شبيهة بـ Object.freeze في وقت التشغيل.
⚠️ تنبيه الـ Readonly سطحي: الخاصية المتداخلة (الكائن) تصبح للقراءة فقط ككل لكن حقولها الداخلية تبقى قابلة للتعديل؛ وتصبح خصائص المصفوفات ReadonlyArray لكن عناصرها من الكائنات تبقى قابلة للتعديل أيضًا. اكتب DeepReadonly بنفسك لحماية عميقة.
💡 تلميح الفرق عن as const: يعمل Readonly<T> على نوع قائم (لا يغيّر استنتاج الحرفيات — تبقى mode من نوع string)، بينما يعمل as const على الحرفي نفسه (تضيق mode إلى "dark"). استخدم as const لضييق الحرفيات وReadonly لمجرد منع التعديل.
🏷️ الأنواع المساعدة ذات صلة
💡 حالات ذات صلة
المزيد من الحالات قادم قريبًا.
📚 دروس ذات صلة
❓ أسئلة شائعة
س ما الفرق بين Readonly و Object.freeze؟
ج الـ Readonly حماية في وقت الترجمة فقط تزول بعد الترجمة (وينجح التعديل في وقت التشغيل)؛ أما Object.freeze فيجمّد وقت التشغيل مانعًا الكتابة بصمت (أو برمي خطأ في الوضع الصارم). يمكن الجمع بينهما: Readonly في الأنواع وfreeze في التشغيل.
س هل يمكن تعديل خاصية readonly عبر تأكيد as؟
ج نعم يمكن تجاوزها: (config as { debug: boolean }).debug = true ينجح في الترجمة. وهذا يدل على أن readonly اصطلاح في وقت الترجمة لا قيد في وقت التشغيل — وتجاوزه تخلٍّ متعمد عن الحماية يجب منعه في شيفرة الفريق.
س ما علاقة ReadonlyArray بـ readonly T[]؟
ج متكافئان تمامًا: readonly T[] صيغة مختصرة من ReadonlyArray<T>. كلاهما يمنع push/pop والإسناد بالفهرس، وكلاهما حماية سطحية للقراءة فقط شأن Readonly<T> مع خصائص الكائنات.