创建一个继承 @Body() 或 @Param() 装饰器的自定义 NestJs 装饰器?

Dan*_*tos 7 typescript nestjs

我使用的是 NestJs,并且在我的许多控制器中我都在使用:

@Post(":id")
public create(
    @Param('id', new ParseIntPipe()) id: number, 
    @Body(new ValidationPipe({transform: true})) myData: MyClass) {
        // ... 
    }
Run Code Online (Sandbox Code Playgroud)

我想通过创建自定义装饰器来清理我的代码,例如:

@Bind() => @Body(new ValidationPipe({transform: true}))
Run Code Online (Sandbox Code Playgroud)

或者

@Id() => @Param('id', new ParseIntPipe())
Run Code Online (Sandbox Code Playgroud)

那么代码会比以前更干净:

@Post(":id")
public create(@Id() id: number, @Bind() myData: MyClass) {
    // ... 
}
Run Code Online (Sandbox Code Playgroud)

像这样继承这些装饰器的正确方法是什么?

谢谢

小智 6

由于装饰器只是普通函数,您可以简单地创建一个返回被调用装饰器的函数:

装饰器.ts

import { Body, Param, ParseIntPipe, ValidationPipe } from '@nestjs/common';

export const Bind = () => Body(
  new ValidationPipe({transform: true}),
);

export const Id = () => Param('id', new ParseIntPipe());
Run Code Online (Sandbox Code Playgroud)

然后将它们用作装饰器:

import { Id, Bind } from './decorators';

// ... 

@Post(":id")
public create(@Id() id: number, @Bind() myData: MyClass) {
    // ... 
}
Run Code Online (Sandbox Code Playgroud)

  • 我正在回答这个问题,同时出现了这个问题,哈哈,我可以确认这确实有效。 (2认同)