تتحكم معدلات الخصائص هذه في ما إذا كانت الخصائية مطلوبة وما إذا كان يمكن إعادة تعيينها.
الاختيارية (?)
ts
interface User {
name: string;
email?: string; // optional — may be absent
}
const a: User = { name: "Ann" }; // ✅ email omitted
const b: User = { name: "Bo", email: "b@x" }; // ✅ included
function f(u: User) {
u.email.length; // ❌ Error: email is possibly 'undefined'
u.email?.length; // ✅ optional chaining handles the maybe-undefined
}
الخصية الاختيارية لها النوع T | undefined، لذا يفرض المترجم عليك التعامل مع حالة الغياب — مما يمنع أخطاء "cannot read property of undefined".
readonly
ts
interface Point { readonly x: number; readonly y: number; }
const p: Point = { x: 1, y: 2 };
p.x = 5; // ❌ Error: cannot assign to readonly property
// arrays too
const nums: readonly number[] = [1, 2, 3];
nums.push(4); // ❌ push doesn't exist on readonly array
readonly موجود وقت الترجمة فقط (بدون فرض وقت التشغيل)، لكنه يوثق ويفرض عدم القابلية للتغيير في نظام الأنواع، مما يؤدي إلى التقاط التغييرات العرضية.
مدمجة وعلى نطاق واسع
ts
interface Config { readonly id: string; tags?: readonly string[]; }
type Frozen = Readonly<User>; // utility type makes ALL props readonly
لماذا هذا مهم
? يمثل البيانات الاختيارية فعلاً ويفرض سلامة null؛ readonly يعبر عن عدم القابلية للتغيير وينفذها (رائع للإعدادات والخصائص ومنع التحور الحالة العرضي).
كلاهما يدفع فحص الصحة إلى المترجم.
