Декораторы

Специальные функции для модификации классов, методов и свойств через аннотации.

Зачем нужно

  • Добавление поведения без изменения исходного кода (метапрограммирование)
  • Логирование, валидация, кэширование декларативно
  • Основа фреймворков: Angular, NestJS, TypeORM

Где используется

  • Angular (@Component, @Injectable), NestJS (@Controller, @Get), TypeORM (@Entity)

Включение

{
  "compilerOptions": {
    "experimentalDecorators": true
  }
}

Типы декораторов

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

function Sealed(constructor: Function) {
  Object.seal(constructor);
  Object.seal(constructor.prototype);
}

@Sealed
class User {
  name = 'Alice';
}

Декоратор метода

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

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

Декоратор свойства

function MinLength(min: number) {
  return function (target: any, key: string) {
    let value: string;
    Object.defineProperty(target, key, {
      get:  => value,
      set: (v: string) => {
        if (v.length < min) throw new Error(`${key} min length: ${min}`);
        value = v;
      },
    });
  };
}

class Form {
  @MinLength(3)
  username!: string;
}

TC39 Decorators (Stage 3)

Новый стандарт отличается синтаксически. TS 5.0+ поддерживает оба варианта. Для нового кода рекомендуется новый стандарт (без experimentalDecorators).

Связанные темы

Ресурсы