Как объединить возвращаемое значение нескольких декораторов параметров?

#javascript #typescript #parameters #nestjs #decorator

Вопрос:

У меня есть несколько декораторов параметров:

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

export const Sort = createParamDecorator(
  async (_: unknown, context: ExecutionContext) => {
    const req = context.switchToHttp().getRequest();
    // some async stuff
    return { sort: { field1: 1, field2: -1 } };
  },
);

export const Pagination = createParamDecorator(
  async (_: unknown, context: ExecutionContext) => {
    const req = context.switchToHttp().getRequest();
    // some async stuff
    return { page: 1, limit: 1 };
  },
);
 

Я пытаюсь сочинить этих декораторов:

 import { applyDecorators } from '@nestjs/common';

export const PaginationSort = () =>
  applyDecorators(
    Pagination(),
    Sort(),
  );
 

Но когда я использую PaginationSort декоратор в своем контроллере, я получаю значение только от Sort декоратора:

 @Controller()
class MyController {
  @Get()
  async find(@PaginationSort() pagination: PaginationSortEntity) {
    console.log(pagination); // => { sort: { field1: 1, field2: -1 } }
  }
}
 

Как я могу объединить возвращаемые значения обоих декораторов, чтобы иметь

{ sort: { field1: 1, field2: -1 }, page: 1, limit: 1 } ?

Я мог бы использовать декораторы отдельно по разным параметрам метода, но на самом деле я объединяю гораздо больше, чем просто 2 декоратора.

Комментарии:

1. Вы вообще привязываете эти значения к req, или они просто жестко закодированы?

2. @JayMcDoniel Я мог бы сделать это в каждом декораторе: req.paginationSort ??= {}; return Object.assign(req.paginationSort, paginationOrSortReturnValue); Но мне интересно, есть ли другой способ.

3. @JayMcDoniel Нет, я не привязываю эти значения к req, они не жестко закодированы, они вычисляются на основе параметров запроса запроса. Эти декораторы являются чистыми функциями, и я хочу создать их функционально, ничего не изменяя.

4. Если значения вообще не привязаны к запросу, то у декораторов не будет контекста для того, что уже задали другие декораторы, поэтому вы не сможете объединить эти два значения вместе