#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. Если значения вообще не привязаны к запросу, то у декораторов не будет контекста для того, что уже задали другие декораторы, поэтому вы не сможете объединить эти два значения вместе