الخصائص readonly
حدّدوا خصائص الكائن على أنها غير قابلة للتغيير بعد تهيئتها
الخصائص readonly درس مجاني في TypeScript Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في TypeScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة TypeScript Academy 4 دروس في المجموع.
المعدِّل readonly
يحدد المعدِّل readonly خاصيةً يمكن ضبطها مرة واحدة، لكن لا يمكن إعادة إسناد قيمة إليها بعد ذلك. وهو يعبّر عن عدم القابلية للتغيير على مستوى النوع، مما يساعد على منع التغييرات غير المقصودة.
interface Point {
readonly x: number;
readonly y: number;
}
const p: Point = { x: 1, y: 2 };
console.log(p.x, p.y);
// p.x = 5; // Error: cannot assign to readonly propertyreadonly في الواجهات
في الواجهة، يوثّق readonly الحقول التي تظل ثابتة بعد الإنشاء. ويمكن للمستخدمين قراءة هذه الحقول بحرية، لكن المصرّف يمنع أي إعادة إسناد لها.
interface Config {
readonly env: string;
retries: number; // mutable
}
const c: Config = { env: 'prod', retries: 3 };
c.retries = 5; // allowed
console.log(c.env, c.retries);خطأ في الترجمة عند إعادة الإسناد
تُعد محاولة الكتابة إلى خاصية readonly خطأً وقت الترجمة. ويساعد ذلك على اكتشاف فئة كاملة من الأخطاء التي تتغير فيها الحالة المشتركة بشكل غير متوقع.
interface User {
readonly id: number;
name: string;
}
const u: User = { id: 1, name: 'Ada' };
u.name = 'Grace'; // ok
// u.id = 2; // Error
console.log(u);readonly في خصائص الفئات
تدعم الفئات readonly أيضًا. ويمكن تهيئة الحقل للقراءة فقط عند التصريح عنه أو داخل المُنشئ، ولكن لا يمكن تهيئته في أي موضع آخر.
class Circle {
readonly radius: number;
constructor(r: number) {
this.radius = r; // allowed in constructor
}
}
const c = new Circle(5);
console.log(c.radius);الضبط مرة واحدة في المُنشئ
المُنشئ هو الموضع الوحيد خارج التصريح الذي يمكنك فيه إسناد قيمة إلى حقل للقراءة فقط. وبعد اكتمال الإنشاء، تُقفل القيمة طوال عمر الكائن.
class Account {
readonly owner: string;
constructor(owner: string) {
this.owner = owner;
}
rename() {
// this.owner = 'x'; // Error: readonly outside constructor
}
}
console.log(new Account('Sam').owner);خصائص المعاملات readonly
تتيح خصائص المعاملات في TypeScript التصريح عن حقل للقراءة فقط وتهيئته مباشرةً في توقيع المُنشئ، مما يقلل الشيفرة المكررة.
class Vector {
constructor(
readonly x: number,
readonly y: number
) {}
}
const v = new Vector(3, 4);
console.log(v.x, v.y);readonly يعمل وقت الترجمة فقط
الأهم أن readonly موجود في نظام الأنواع فقط. إذ يُحذف وقت التشغيل — فلا مفهوم مماثل له في JavaScript. وهو يمنع إعادة الإسناد في شيفرة TypeScript، وليس في المخرجات المترجمة التي يمكن الوصول إليها عبر مسارات غير مكتوبة بالأنواع.
interface Box { readonly value: number; }
const b: Box = { value: 10 };
// At runtime b is a plain object; readonly is not enforced by JS.
console.log(b.value);readonly مقابل const
لا تخلط بينهما. يمنع const إعادة إسناد متغير. أما readonly فيمنع إعادة إسناد خاصية. ويمكن لكائن const أن يحتوي على خصائص قابلة للتغيير ما لم تكن readonly.
const obj = { count: 0 }; // const binding
obj.count = 5; // allowed: property is mutable
console.log(obj.count);سطحي بطبيعته
إن readonly سطحي: فهو يحمي الخاصية نفسها، وليس محتويات الكائن أو المصفوفة التي تشير إليها. لذلك يظل بإمكان مرجع للقراءة فقط إلى كائن أن يغير حقول ذلك الكائن.
interface Holder { readonly data: { n: number }; }
const h: Holder = { data: { n: 1 } };
// h.data = {...}; // Error
h.data.n = 99; // allowed: inner field is not readonly
console.log(h.data.n);استخدام readonly لواجهات برمجة تطبيقات أكثر أمانًا
يشير تحديد حقول الكائنات المُعادة باستخدام readonly إلى أنه لا ينبغي للمستدعين تغييرها. فهو يعبّر عن القصد في النوع، ويحوّل إساءة الاستخدام إلى خطأ وقت الترجمة بدلًا من خطأ صامت.
interface Snapshot { readonly takenAt: number; readonly size: number; }
function snapshot(): Snapshot {
return { takenAt: Date.now(), size: 1024 };
}
const s = snapshot();
console.log(s.size);readonly في تواقيع الفهرسة
يمكنك أيضًا جعل تواقيع الفهرسة للقراءة فقط، لإنشاء نوع شبيه بالخريطة يمكن قراءة إدخالاته، لكن لا يمكن إعادة إسنادها عبر الفهرس.
interface Scores {
readonly [name: string]: number;
}
const scores: Scores = { ada: 95, sam: 88 };
console.log(scores.ada);
// scores.ada = 100; // Errorاختبار سريع
اختبر مدى فهمك للخصائص readonly.
مراجعة: خصائص readonly
لقد تعلمت أن readonly:
- يسمح بضبط الخاصية مرة واحدة، ثم يمنع إعادة إسنادها.
- يمكن ضبطه عند التصريح عن حقول الفئة أو داخل المُنشئ.
- يعمل وقت الترجمة فقط وهو سطحي — فلا يجمّد البيانات المتداخلة بعمق.
- يختلف عن
const: فأحدهما يحمي الخصائص، والآخر يحمي ارتباطات المتغيرات.
بعد ذلك، سنتناول المصفوفات وtuples للقراءة فقط.
interface Meta { readonly id: number; }
const m: Meta = { id: 42 };
console.log(m.id);الأسئلة الشائعة
هل درس «الخصائص readonly» مجاني؟
نعم — نص درس «الخصائص readonly» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة TypeScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة TypeScript Academy 4 دروس في المجموع.
ماذا ستتعلم في «الخصائص readonly»؟
حدّدوا خصائص الكائن على أنها غير قابلة للتغيير بعد تهيئتها تتمرن على TypeScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ TypeScript Academy؟
لا تُشترط خبرة سابقة. TypeScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «الخصائص readonly»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس TypeScript Academy هذا؟
نعم. كل درس في TypeScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الخصائص readonly
- المصفوفات والصفائف readonly
- ReadonlyArray وReadonlyMap
- أنماط عدم القابلية للتغيير العميقة