如何在 NestJS 项目中自定义装饰器,四种不同类型装饰器Decorator

发布时间:2023年12月26日

背景

装饰器的作用就像其名字一样,它就像一件华丽的外衣,给你的 NestJS 代码提供了吸引力和可读性。这是因为装饰器可以改变我们对代码的处理方式,并帮助我们实现更高级的编程模式。在本文中,我们将探讨如何创建自定义装饰器,这将大大增强我们的 NestJS 使用体验。

装饰器类型

  • 类装饰器(Class Decorators)

    在NestJS中,类装饰器最常用在控制器和模块定义上,例如 @Controller等。

  • 方法装饰器(Method Decorators)

    在NestJS中,方法装饰器主要用于路由处理,例如**@Get@Post**等。

  • 属性装饰器(Property Decorators)

    在NestJS中,属性装饰器通常用于依赖注入,例如**@Inject**装饰器等。

  • 参数装饰器(Parameter Decorators)

    在NestJS中,参数装饰器一般用于提取请求或路由参数,例如**@Req@Res@Query**等。

自定义四种装饰器

1. 类装饰器

类装饰器在声明前被申明,它接受类的构造函数作为参数。

function MyCustomClassDecorator() {
  return function(constructor: Function) {
    // 添加自定义逻辑...
    // 例如,我们可以添加新的属性或方法
  }
}

创建装饰器后,我们就可以开始使用它。

@MyCustomClassDecorator()
class MyClass {
  //...
}

2. 属性装饰器

属性装饰器是配合类装饰器一起使用的。你可以在类的属性上使用装饰器,以增加或改变属性的行为。

function MyCustomPropertyDecorator(target: any, propertyKey: string) {
  // 添加自定义逻辑...
  // 比如,我们可以监听属性值的改变,更改属性的配置等
}

我们来看看如何在类中使用这个装饰器:

class MyClass {
  @MyCustomPropertyDecorator
  myProperty: string;
}

3. 方法装饰器

方法装饰器也非常实用,通常用来改变方法的行为,例如包装方法、纪录日志、更改返回值等。

function MyCustomMethodDecorator(
  target: any,
  propertyKey: string,
  descriptor: PropertyDescriptor
) {
  // 添加自定义逻辑... 根据需要更改或替换原有方法
}

然后,你就可以在你的方法上使用装饰器。

class MyClass {
  @MyCustomMethodDecorator
  myMethod() {
    //...
  }
}

4. 参数装饰器

参数装饰器通常用于从请求中提取数据。

import { createParamDecorator, ExecutionContext } from '@nestjs/common';

export const MyCustomParamDecorator = createParamDecorator(
  (data: unknown, ctx: ExecutionContext) => {
    const request =  ctx.switchToHttp().getRequest();
    // 添加自定义逻辑,如提取并返回特定的请求数据
  },
);

下面是使用这个自定义参数装饰器的示例:

class MyClass {
  myMethod(@MyCustomParamDecorator data: string) {
    //...
  }
}

总结

总的来说,创建自定义装饰器是一种强大的技术,让我们的代码变得更加轻量,逻辑更加清晰。理解并使用装饰器是我们深化对 NestJS 的理解,并充分利用其强大功能的关键。尽管本文已经为你介绍了如何创建各种类型的装饰器,确保在实战中正确使用它们仍然是很重要的。

值得注意的是,尽管装饰器具有强大的功能,但应谨慎使用。一个类或函数上过多的装饰器可能会使代码难以阅读和理解,因此在考虑使用装饰器时,请确保它们能让你的代码更加清晰,而不是复杂化。此外,尽管装饰器可以帮助我们实现很多功能,但在很多情况下,更适合的解决方案可能仍是可读性更高、更简单的代码结构和设计模式。

文章来源:https://blog.csdn.net/m0_37890289/article/details/135209652
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。