Ответ
Декоратор — это специальная функция, которая добавляет метаданные или изменяет поведение класса, метода, свойства или параметра. В TypeScript декораторы применяются с @-синтаксисом и выполняются во время инициализации класса.
Пример декоратора метода:
function log(target: any, key: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function(...args: any[]) {
console.log(`Calling ${key} with args:`, args);
return originalMethod.apply(this, args);
};
return descriptor;
}
class Example {
@log
greet(name: string) {
return `Hello, ${name}!`;
}
}
Основные типы декораторов:
- Класса (
@ClassDecorator) - Метода (
@MethodDecorator) - Свойства (
@PropertyDecorator) - Параметра (
@ParameterDecorator)
Декораторы часто используются для логирования, валидации, dependency injection (например, в Angular) или модификации поведения.
Ответ 18+ 🔞
Да ты посмотри, какие штуки придумали, блядь! Декоратор, сука! Ну это ж просто функция, которая как банный лист на всё лепится, чтобы метаданные прикрутить или поведение поменять. В TypeScript это вообще красота — ставишь собачку @ перед чем надо, и всё, пиздец, магия начинается прямо при инициализации класса.
Вот смотри, примерчик, чтобы не быть, как тот Герасим, немым:
function log(target: any, key: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function(...args: any[]) {
console.log(`Calling ${key} with args:`, args);
return originalMethod.apply(this, args);
};
return descriptor;
}
class Example {
@log
greet(name: string) {
return `Hello, ${name}!`;
}
}
Видишь? Навесил @log на метод — и теперь каждый вызов будет в консоль проёбываться, кто и с какими аргументами пришёл. Удобно, блядь, для отладки — не надо вручную в каждый метод console.log впихивать, ебать мои старые костыли.
А видов-то этих декораторов, оказывается, овердохуища:
- На класс (
@ClassDecorator) — обернёт весь класс, как тот мешок для Муму. - На метод (
@MethodDecorator) — вот как в примере выше, самый популярный пацан. - На свойство (
@PropertyDecorator) — чтобы за какими-то полями следить. - На параметр (
@ParameterDecorator) — это уже для самых хитрых жоп, чтобы в аргументы метода заглянуть.
Используют эту хуйню везде: логирование, валидация, dependency injection (как в том Angular, который весь на них и стоит, блядь). В общем, мощный инструмент, чтобы не повторять один и тот же код, как мантру, в каждом классе. Главное — не переборщить, а то получится пиздопроебибна из собачек и скобочек, в которой ни хуя не разберёшься.