DEV Community

Saad Naeem
Saad Naeem

Posted on

Exploring TypeScript Decorators: A Deep Dive into Metadata and Annotations

TypeScript decorators are a powerful feature that allows developers to add metadata and behavior to classes, methods, properties, and parameters. In this post, we'll take a deep dive into decorators, exploring their syntax, usage, and the concept of metadata and annotations in TypeScript.

Understanding TypeScript Decorator

Decorators are special expressions that evaluate to a function, which is executed at runtime with information about the decorated declaration. They are prefixed with the @ symbol and can be attached to classes, methods, accessors, properties, or parameters.

function myDecorator(target: any, propertyKey: string): void {
  // Decorator logic
}

class MyClass {
  @myDecorator
  myMethod() {
    // Method implementation
  }
}
Enter fullscreen mode Exit fullscreen mode

Types of Decorators

  1. Class Decorators: Applied to classes, allowing you to modify the class constructor or add metadata to the class.
  2. Method Decorators: Applied to methods, enabling you to modify their behavior or add metadata to them.
  3. Property Decorators: Applied to properties, allowing you to add metadata to class properties.
  4. Parameter Decorators: Applied to method parameters, providing metadata about the arguments of methods.

Working with Metadata and Annotations

One of the most powerful aspects of decorators is their ability to work with metadata and annotations. Metadata is additional information that describes the structure of your code, such as types, interfaces, and classes. Annotations are markers added to code elements to provide additional information.

const MY_METADATA_KEY = Symbol("myMetadataKey");

function myDecorator(target: any, propertyKey: string) {
  Reflect.defineMetadata(MY_METADATA_KEY, "myValue", target, propertyKey);
}

class MyClass {
  @myDecorator
  myMethod() {
    // Method implementation
  }
}

const metadataValue = Reflect.getMetadata(MY_METADATA_KEY, MyClass.prototype, "myMethod");
console.log(metadataValue); // Output: "myValue"

Enter fullscreen mode Exit fullscreen mode

Real-World Use Cases

1.Dependency Injection: Using decorators to mark classes or properties as injectable for dependency injection frameworks.
2.Validation: Adding validation rules to methods or properties using decorators.
3.Logging: Automatically logging method calls or property accesses with decorators.

Conclusion

TypeScript decorators provide a powerful mechanism for adding metadata and behavior to your code. By understanding their syntax and usage, you can leverage decorators to write more expressive, maintainable, and flexible code. Experiment with decorators in your projects to unlock their full potential!

Top comments (0)