Розуміння декораторів TypeScript

Декоратори TypeScript забезпечують потужний спосіб додавання функціональності до класів, методів, властивостей і параметрів під час виконання. Вони часто використовуються в таких фреймворках, як Angular, для впровадження залежностей, журналювання, перевірки тощо. Ця стаття пояснює різні типи декораторів у TypeScript і як їх ефективно використовувати.

Що таке декоратори TypeScript?

Декоратори в TypeScript — це функції, перед якими стоїть символ @ і які можна приєднати до різних елементів, таких як класи, методи або властивості. Вони дозволяють змінювати поведінку коду, до якого вони приєднані, не змінюючи безпосередньо код.

Види декораторів

  • Декоратори класів: Застосовуються до всього класу.
  • Декоратори методів: Застосовуються до методів у класі.
  • Декоратори властивостей: Застосовується до властивості в класі.
  • Декоратори параметрів: Застосовуються до параметрів методу в класі.

Як увімкнути декоратори в TypeScript

Перш ніж використовувати декоратори, увімкніть їх у файлі tsconfig.json, встановивши для "experimentalDecorators" значення true.

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

Декоратори класу

Декоратор класу застосовується до всього класу. Це корисно для додавання метаданих або зміни поведінки класу.

function Controller(route: string) {
  return function (target: Function) {
    target.prototype.route = route;
  };
}

@Controller('/api/user')
class UserController {
  // Class logic
}

console.log(new UserController().route); // Outputs: '/api/user'

Декоратори методів

Декоратори методів застосовуються до методів у класі. Ці декоратори можна використовувати для зміни або реєстрації поведінки методу.

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

class Calculator {
  @Log
  add(a: number, b: number) {
    return a + b;
  }
}

const calculator = new Calculator();
calculator.add(2, 3); // Logs: 'Calling add with arguments: 2,3'

Декоратори нерухомості

Декоратори властивостей використовуються для додавання функціональності до властивостей у класі. Вони можуть бути корисними для перевірки або додавання метаданих до властивості.

function ReadOnly(target: any, key: string) {
  const descriptor: PropertyDescriptor = {
    writable: false
  };
  return descriptor;
}

class Person {
  @ReadOnly
  name: string = 'John Doe';
}

const person = new Person();
person.name = 'Jane Doe'; // Error: Cannot assign to read only property 'name'

Декоратори параметрів

Декоратори параметрів використовуються для зміни або реєстрації інформації про параметри методу.

function LogParameter(target: any, propertyName: string, index: number) {
  const metadataKey = `log_${propertyName}_parameters`;
  
  if (Array.isArray(target[metadataKey])) {
    target[metadataKey].push(index);
  } else {
    target[metadataKey] = [index];
  }
}

class Demo {
  method(@LogParameter param1: string, @LogParameter param2: number) {
    // Method logic
  }
}

Висновок

Декоратори в TypeScript забезпечують потужний спосіб покращити функціональність вашого коду, не змінюючи його структуру. Розуміючи, як використовувати декоратори класів, методів, властивостей і параметрів, ви можете реалізувати такі розширені функції, як журналювання, перевірка та впровадження залежностей. Декоратори є ключовою функцією TypeScript, яка може значно покращити процес розробки, особливо у великих програмах.