Понимание декораторов 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, которая может значительно улучшить ваш рабочий процесс разработки, особенно в больших приложениях.