@decorator الزخارف (Decorators)
آخر تحديث: 2026-10-22
@decorator الزخارف (Decorators)
الزخرفة صياغة خاصة توضع قبل الأصناف والمناهج والخصائص والمعاملات على الشكل @name: دالة غلاف ترفق سلوكًا بالصنف (تسجيل أحداث، تحقق، حقن تبعيات) دون المساس بشيفرة الصنف ذاته. وما تزال الزخارف في TypeScript ميزة تجريبية تتطلب تفعيل experimentalDecorators في tsconfig؛ وتستخدمها أطر مثل NestJS وTypeORM بكثافة، وإتقانها شرط لازم لقراءة شيفرة هذه الأطر.
| المجموعة | الإعداد والتطبيق |
|---|---|
| النوع | بناء الجملة |
| الوضع الصارم | غير مطلوب |
ℹ️ معلومة يحوّل المحرر لغة TypeScript إلى JavaScript ثم يشغّلها (بدون فحص أنواع)؛ راجع ناتج كل مثال لنتيجة فحص الأنواع.
📝 الصيغة
// ديكوريتر الكلاس: يستقبل المُنشئ
function sealed(Ctor: Function): void {
Object.seal(Ctor);
Object.seal(Ctor.prototype);
}
// ديكوريتر الدالة: يستقبل (النموذج الأولي، اسم الدالة، واصف الخاصية)
function logged(target: object, key: string, desc: PropertyDescriptor): void {
const original = desc.value;
desc.value = function (...args: unknown[]) {
console.log("call", key, args);
return original.apply(this, args);
};
}
@sealed
class Calculator {
@logged
add(a: number, b: number) { return a + b; }
}
⚙️ المعاملات
| ClassDecorator | المعامل هو باني الصنف؛ يمكنه تعديل الصنف أو إعادة صنف جديد يحل محله — وتُستخدم له قيود «الصنف ككل» مثل @sealed |
|---|---|
| MethodDecorator | يُنفَّذ مرة واحدة عند تعريف الصنف، ويغلّف المنهج الأصلي بإعادة كتابة desc.value؛ وإعادة واصف جديد تستبدل الواصف كله |
| experimentalDecorators | مفتاح في tsconfig، ومن دونه يظهر خطأ «الزخارف ميزة تجريبية»؛ ويعتمد عليه أطر الأوساط البيئية (NestJS وغيرها) حاليًا بناءً على هذه النسخة التجريبية |
القيمة المُعادة:يمكن للزخرفة الصنفية أن تعيد بانيًا جديدًا يحل محل الصنف الأصلي (وإن لم تعد شيئًا فالصنف الأصلي يبقى)؛ ويمكن للزخرفة المنهجية أن تعيد واصفًا للخاصية (property descriptor) جديدًا أو أن تعيد undefined وتعمل عبر الآثار الجانبية فقط.
▶ مثال
عدّل الكود أدناه واضغط «جرّب» لرؤية نتيجة التحويل:
الناتج:
-> add(2, 3)
add = 5
-> mul(4, 5)
mul = 20
(مخرجات التشغيل بعد الترجمة؛ يكتمل التغليف الزخرفي المنهجي عند تعريف الصنف — فعند الاستدعاء يُطبع -> add(2, 3) أولًا ثم تُعاد النتيجة)