есть постоянная проблема с типизацией виртуальных полей.
                  
                  
                  
                  
                  
                  Приведу пример и объясню суть.
                  
                  
                  
                  
                  
                  К примеру есть схема юзера:
                  
                  
                  @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?
Обсуждают сегодня