есть постоянная проблема с типизацией виртуальных полей.
Приведу пример и объясню суть.
К примеру есть схема юзера:
@Schema({ toJSON: { virtuals: true }, toObject: { virtuals: true } })
export class User {
@Prop({ required: true })
email: string;
@Prop({ required: true })
password: string;
}
когда я получаю документ юзера я имею такую структуру:
{
_id: 61205e32ac6ca237401712ec,
email: 'example@example.net',
__v: 0,
id: '61205e32ac6ca237401712ec'
}
Первые три поля как я понимаю реальные поля, которые хранятся в базе, а последнее поле "id" - виртуальное.
Так вот, проблема в том, что когда я получаю этот объект юзера, я ставлю ему тип как User(из схемы) а там кроме email и password полей никаких больше не указано, по этому тайпскрипт начинает ругаться, что поля "id" нет в типе User.
Окей, пошел я в офф. докумангуста, смотреть что-там по тайпскрипту.
В доках пишут, что можно создать интерфейс вместе со схемой:
interface User {
name: string;
email: string;
avatar?: string;
// возможно сюда нужно добавлять поля "_id" и "id" для каждой схемы?
}
// 2. Create a Schema corresponding to the document interface.
const schema = new Schema<User>({
name: { type: String, required: true },
email: { type: String, required: true },
avatar: String
});
...и вот тут я подумал, что в интерфейс как раз можно добавить поля "_id" и "id"
Но здравый смысл мне подсказывает, что это плохое решение, так как айдишники нужно в каждой схеме дублировать, и что должно быть другое решение, которое я так и не смог найти.
Подскажите пожалуйста как вообще это грамотно решить?
Мне предложили юзать DTO, то есть пишешь ещё один класс, и кстати там ещё обвязываешь ApiProperty
id, _id поля в dto?
Обсуждают сегодня