Exploring Custom Decorators in TypeScript and Nest.js

brown and black armchair beside white wooden shelf

Exploring Custom Decorators in TypeScript and Nest.js

Custom decorators in TypeScript and frameworks like Nest.js provide a powerful way to enhance code readability, maintainability, and functionality. In this blog post, we’ll delve into what decorators are, how to create custom decorators, their practical applications, and how they can be utilized within a Nest.js application.

Understanding Decorators

Decorators in TypeScript are a design pattern that allows you to attach metadata to classes, methods, properties, or parameters at design time. They are denoted by an @ symbol followed by the decorator name and can modify the behavior of the target they are applied to.

Creating Custom Decorators

To create a custom decorator in TypeScript, you define a function that takes parameters specific to the decorator’s purpose and returns a function that receives metadata about the target element. Here’s a simple example of a custom decorator that logs method calls:

// Custom decorator example
function LogMethod(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
  const originalMethod = descriptor.value;

  descriptor.value = function(...args: any[]) {
    console.log(`Calling ${propertyKey} with arguments: ${JSON.stringify(args)}`);
    const result = originalMethod.apply(this, args);
    console.log(`Method ${propertyKey} returned: ${JSON.stringify(result)}`);
    return result;
  };

  return descriptor;
}

// Usage example
class MyClass {
  @LogMethod
  greet(name: string) {
    return `Hello, ${name}!`;
  }
}

const instance = new MyClass();
instance.greet('Alice'); // Outputs: Calling greet with arguments: ["Alice"]
                         //         Method greet returned: "Hello, Alice!"

Practical Applications of Custom Decorators

  1. Logging: As demonstrated above, decorators can be used to log method calls, which can be particularly useful for debugging and tracing execution flow.
  2. Authorization: Decorators can enforce authorization rules by checking permissions before executing methods.
  3. Validation: Decorators can validate input parameters before allowing method execution.
  4. Metrics and Monitoring: Decorators can capture metrics such as execution time, method calls, and resource usage.

Integrating with Nest.js

Nest.js leverages TypeScript decorators extensively to define routes, inject dependencies, handle middleware, and more. Here’s how you can integrate a custom decorator within a Nest.js application:

// Example of a custom decorator in Nest.js
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';

@Injectable()
export class LoggerMiddleware implements NestMiddleware {
  use(req: Request, res: Response, next: NextFunction) {
    console.log(`Request received: ${req.method} ${req.url}`);
    next();
  }
}

// Applying the middleware globally in AppModule
import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import { LoggerMiddleware } from './logger.middleware';

@Module({})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(LoggerMiddleware).forRoutes('*');
  }
}

In this example, LoggerMiddleware is a custom decorator used as middleware in a Nest.js application to log incoming requests.

Conclusion

Custom decorators in TypeScript and Nest.js enable developers to extend functionality, enforce rules, and streamline code organization effectively. By understanding their mechanics and exploring practical examples, you can leverage decorators to enhance the robustness and clarity of your applications. Whether you’re enhancing logging, enforcing security measures, or integrating with frameworks like Nest.js, custom decorators offer a versatile toolset for modern TypeScript development.

Also Read:

Leave a Reply

Your email address will not be published. Required fields are marked *

Share this article:

RSS2k
Follow by Email0
Facebook780
Twitter3k
120
29k
130k

Also Read: