0Pricing
Frontend Academy · درس

Decorators والبيانات الوصفية

فعّل decorators التجريبية، واكتب decorators للفئات والطرائق والخصائص، واستخدم reflect-metadata لأنماط حقن الاعتماديات

Decorators والبيانات الوصفية درس مجاني في Frontend Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Frontend Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Frontend Academy 4 دروس في المجموع.

ما هي Decorators؟

Decorators هي دوال تعدّل الفئات أو الأساليب أو الخصائص أو المعلمات وقت تعريفها. وتُستخدم بكثرة في Angular وNestJS وTypeORM وMobX المعتمد على الفئات.

صياغة Decorator

ضعوا @DecoratorName قبل فئة أو أسلوب أو خاصية أو معلمة. وتُشغَّل دالة Decorator عند تعريف الفئة.

@Component({ selector: 'app-root' })
export class AppComponent {
  @Input() title: string;

  @HostListener('click')
  onClick() {
    console.log('clicked');
  }
}

تفعيل Decorators

فعّلوا العلامة التجريبية في tsconfig.json. أما Decorators القياسية الجديدة في ECMAScript Stage 3 (في TypeScript 5.0 وما بعده)، فلا تحتاج إلى هذه العلامة، لكن لها دلالات مختلفة.

{
  "compilerOptions": {
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true
  }
}

Class Decorator

تتلقى الباني كوسيط لها. ويمكنها استبدال الفئة أو تغليفها أو توسيعها.

function Singleton<T extends { new (...a: any[]): {} }>(target: T) {
  let instance: T;
  return class extends target {
    constructor(...args: any[]) {
      if (!instance) instance = new target(...args) as T;
      return instance;
    }
  };
}

@Singleton
class Logger { /* ... */ }

Method Decorator

تتلقى (target, key, descriptor). ويمكنها تغليف الأسلوب — مثلًا لتسجيل الاستدعاءات.

function Log(target: any, key: string, descriptor: PropertyDescriptor) {
  const original = descriptor.value;
  descriptor.value = function (...args: any[]) {
    console.log(`[${key}]`, args);
    return original.apply(this, args);
  };
}

class Service {
  @Log
  greet(name: string) { return `Hello ${name}`; }
}

Property Decorator

تتلقى (target, key). وغالبًا ما تُستخدم مع reflect-metadata لتسجيل معلومات عن الخاصية.

function Required(target: any, key: string) {
  const existing = Reflect.getMetadata('required', target) || [];
  Reflect.defineMetadata('required', [...existing, key], target);
}

class User {
  @Required name: string;
  @Required email: string;
}

Parameter Decorator

تتلقى (target, key, parameterIndex). وتُستخدم لحقن الاعتماديات — لتسجيل الخدمات المطلوبة لكل معلمة.

function Inject(token: string) {
  return function (target: any, key: string, index: number) {
    const existing = Reflect.getMetadata('inject', target, key) || {};
    existing[index] = token;
    Reflect.defineMetadata('inject', existing, target, key);
  };
}

class UserService {
  constructor(@Inject('Database') db: Database) {}
}

reflect-metadata

reflect-metadata هي حشوة برمجية تتيح لـ Decorators قراءة البيانات الوصفية وكتابتها على الفئات. وهي مطلوبة لحقن الاعتماديات في Angular وللعديد من أطر ORM.

npm install reflect-metadata

// main.ts (entry point):
import 'reflect-metadata';

import { Reflect } from 'reflect-metadata';
Reflect.defineMetadata('key', 'value', target);
Reflect.getMetadata('key', target); // 'value'

مصانع Decorator

يعيد المصنع Decorator — ويُستخدم لتمرير الوسائط.

function Component(config: { selector: string }) {
  return function (target: any) {
    target.selector = config.selector;
  };
}

@Component({ selector: 'app-root' })
class AppComponent {}

حالة استخدام للتحقق

ادمجوا Decorators للخصائص مع دالة validate() لإنشاء مكتبة تحقق صغيرة.

// Decorator records that a field is required:
function Required(target: any, key: string) {
  const fields = Reflect.getMetadata('required', target) || [];
  Reflect.defineMetadata('required', [...fields, key], target);
}

class User {
  @Required name!: string;
  @Required email!: string;
}

function validate(obj: any): string[] {
  const required: string[] = Reflect.getMetadata('required', obj) || [];
  return required.filter(k => obj[k] == null);
}

Decorators من Stage 3 (TC39)

تملك Decorators الموحّدة (في TypeScript 5.0 وما بعده، والمدعومة في Node 22 وما بعده خلف علامة) توقيعًا مختلفًا. ولا تحتاج إلى العلامة التجريبية أو إلى reflect-metadata.

متى تُستخدم Decorators

استخدموا Decorators عندما يوفرها إطار العمل (Angular وNestJS وTypeORM). لا تنشئوا Decorators خاصة بكم في شيفرة الواجهة الأمامية العادية — فهي تضيف تعقيدًا وتربطكم بسلوك محدد لبيئة التشغيل.

تحقق سريع

ما علامات tsconfig التي يجب تفعيلها لاستخدام Decorators القديمة (التجريبية) مع انعكاس البيانات الوصفية؟

مراجعة: Decorators

تعدّل Decorators الفئات والأساليب والخصائص والمعلمات وقت تعريفها. فعّلوا experimentalDecorators وemitDecoratorMetadata. تختلف توقيعات Decorators للفئات والأساليب والخصائص والمعلمات. يخزّن reflect-metadata البيانات الوصفية، بينما تمرّر المصانع الوسائط. تُستخدم بكثرة في Angular وNestJS وTypeORM. تُعد Decorators من Stage 3 (في TypeScript 5 وما بعده) المستقبل، ولا تحتاج إلى علامات.

الأسئلة الشائعة

هل درس «Decorators والبيانات الوصفية» مجاني؟

نعم — نص درس «Decorators والبيانات الوصفية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Frontend Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Frontend Academy 4 دروس في المجموع.

ماذا ستتعلم في «Decorators والبيانات الوصفية»؟

فعّل decorators التجريبية، واكتب decorators للفئات والطرائق والخصائص، واستخدم reflect-metadata لأنماط حقن الاعتماديات تتمرن على Frontend Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Frontend Academy؟

لا تُشترط خبرة سابقة. Frontend Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «Decorators والبيانات الوصفية»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Frontend Academy هذا؟

نعم. كل درس في Frontend Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. أنواع Template Literal
  2. Decorators والبيانات الوصفية
  3. TypeScript مع React: الأنواع العامة لـ FC وhooks
  4. الوضع الصارم والتخلّص من any
← العودة إلى Frontend Academy