---
sidebar_position: 10
---

# Декораторы

Декораторы — это специальный вид функций, которые позволяют изменять или дополнять поведение классов, их методов, свойств и параметров. Они используются для метапрограммирования и широко применяются, например, в Angular.

Особенности:
- Включаются флагом experimentalDecorators в tsconfig.json.
- Представляют собой функции, принимающие конструктор или описание метода/свойства.
- Применяются с @ перед именем.

Типы декораторов:
1. Класс (@ClassDecorator)
2. Метод (@MethodDecorator)
3. Свойство (@PropertyDecorator)
4. Аксессор (@AccessorDecorator)
5. Параметр (@ParameterDecorator)

## Примеры использования
1. **Декоратор класса** - Добавляет новое свойство или изменяет поведение класса.
```ts
function WithTimestamp(constructor: Function) {
    constructor.prototype.timestamp = new Date();
}

@WithTimestamp
class MyClass {}

const obj = new MyClass();
console.log((obj as any).timestamp); // Выведет текущую дату
```

2. **Декоратор метода** - Логирует вызов метода.
```ts
function Log(target: any, methodName: string, descriptor: PropertyDescriptor) {
    const original = descriptor.value;
    descriptor.value = function (...args: any[]) {
        console.log(`Вызван метод: ${methodName}, аргументы: ${args}`);
        return original.apply(this, args);
    };
}

class MyClass {
    @Log
    sayHello(name: string) {
        console.log(`Привет, ${name}!`);
    }
}

new MyClass().sayHello("Алиса");
// В консоли:
// Вызван метод: sayHello, аргументы: Алиса
// Привет, Алиса!
```

3. **Декоратор свойства** - Изменяет значение свойства при создании объекта.
```ts
function DefaultValue(value: any) {
    return function (target: any, propertyKey: string) {
        let _val = value;
        Object.defineProperty(target, propertyKey, {
            get: () => _val,
            set: (newVal) => _val = newVal,
            enumerable: true,
            configurable: true
        });
    };
}

class User {
    @DefaultValue("Гость")
    name: string;
}

const user = new User();
console.log(user.name); // "Гость"
```

## Итог
- Декораторы позволяют изменять классы и их члены.
- Их часто используют **в фреймворках (например, Angular)**.
- Требуют включения `experimentalDecorators`.
- Альтернативой являются **метапрограммирование и DI (dependency injection)**.

❗ Важно: В JavaScript декораторы пока находятся в стадии разработки (TC39 Stage 3).

🚀 **_Источник: ChatGPT_**