Я, в принципе, знаю о существовании
этой инструкции, и для ситуаций, когда используется именно метод .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)
Но мне кажется, это немного дичь. Хотя и рабочая дичь. Но, может, есть какое-нибудь поизящней решение?