Как типизировать populate в mongoose?

Я, в принципе, знаю о существовании этой инструкции, и для ситуаций, когда используется именно метод .populate() с дженериком в чейнинге, она работает отлично.

Но для вывода списков с пагинацией я использую плагин mongoose-paginate-ts, и populate там используется не в качестве метода, а как ключ объекта options, значением которого является объект, строка или массив объектов. Т.е. вот так, например:

const options = {
      sort: req.body.sort,
      page: req.body.page,
      limit: req.body.limit,
      select: {
        title: true,
        subtitle: true,
      },
      populate: [
        { path: 'genres', select: ['title', '_id'] },
        { path: 'publishers', select: ['title', '_id'] }
      ]
}

const response = await Model.paginate(options)


Сами genres и publishers в контексте основного документа типизированы, соответственно как Types.ObjectId, но по факту-то, пройдя через populate - они уже не являются Types.ObjectId. Вышеприведенная инструкция решает эту проблему для обычного запроса с использованием populate как метода. Как сделать нечто подобное и для populate как поля объекта конфига, чтобы genres и publishers внутри response переставали быть Types.ObjectId, и становились { _id: string, title: string }?

Можно, конечно запилить что-нибудь эдакое:
const response: PaginationModel<Omit<BookDocument, 'genres' | 'publishers'> & { genres: BasicEntity[]; publishers: BasicEntity[] }> | undefined = await Book.paginate(options)


Но мне кажется, это немного дичь. Хотя и рабочая дичь. Но, может, есть какое-нибудь поизящней решение?
  • Вопрос задан
  • 116 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы