Decorators are a powerful feature in TypeScript that allow you to add metadata or modify the behavior of classes, methods, properties, and parameters. They provide a clean and reusable way to enhance your code without changing its core functionality.
Decorators are special kinds of declarations that can be attached to class declarations, methods, accessors, properties, or parameters. They use the form @expression
, where expression
must evaluate to a function that will be called at runtime with information about the decorated declaration.
To use decorators in TypeScript, you need to enable them in your tsconfig.json file:
{
"compilerOptions": {
"experimentalDecorators": true
}
}
TypeScript supports several types of decorators:
Here's a simple example of a class decorator:
function sealed(constructor: Function) {
Object.seal(constructor);
Object.seal(constructor.prototype);
}
@sealed
class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
greet() {
return "Hello, " + this.greeting;
}
}
In this example, the @sealed
decorator seals both the constructor and its prototype, preventing new properties from being added to them.
Method decorators can be used to modify or replace a method definition. Here's an example:
function log(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
let originalMethod = descriptor.value;
descriptor.value = function(...args: any[]) {
console.log(`Calling ${propertyKey} with`, args);
return originalMethod.apply(this, args);
};
return descriptor;
}
class Calculator {
@log
add(x: number, y: number) {
return x + y;
}
}
This @log
decorator logs method calls with their arguments before executing the original method.
While decorators are powerful, they should be used judiciously. Overuse can lead to code that's harder to understand and maintain. Always consider whether a decorator is the best solution for your specific use case.
Decorators are particularly useful in frameworks like Angular, where they're extensively used for dependency injection and component definition.
Decorators in TypeScript offer a flexible way to add metadata and modify behavior of your code. They're especially useful for implementing aspects of encapsulation and creating reusable code patterns. As you delve deeper into TypeScript, mastering decorators will significantly enhance your ability to write clean, maintainable, and feature-rich applications.