thehighhomie
@thehighhomie

Mongoose: типизация виртуальных полей?

Осваиваю mongodb. Пишу приложение nestjs + mongoose + typescript.

У меня есть постоянная проблема с типизацией виртуальных полей.

Приведу пример и объясню суть.

К примеру есть схема юзера:
@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.
612241cf0d645527509081.png

Окей, пошел я в офф. доку мангуса, смотреть что-там по тайпскрипту.

В доках пишут, что можно создать интерфейс вместе со схемой:

interface User {
name: string;
email: string;
avatar?: string;
// возможно сюда нужно добавлять поля "_id" и "id" для каждой схемы?
}

// 2. Create a Schema corresponding to the document interface.
const schema = new Schema({
name: { type: String, required: true },
email: { type: String, required: true },
avatar: String
});

...и вот тут я подумал, что в интерфейс как раз можно добавить поля "_id" и "id"

Но здравый смысл мне подсказывает, что это плохое решение, так как айдишники нужно в каждой схеме дублировать, и что должно быть другое решение, которое я так и не смог найти.

Подскажите пожалуйста как вообще это грамотно решить?
  • Вопрос задан
  • 266 просмотров
Пригласить эксперта
Ответы на вопрос 1
@StockholmSyndrome
можно наследоваться от Document, правда во втором абзаце той же страницы доков это не рекомендуется делать
import { Document } from "mongoose";

interface User extends Document { /* */ }
Ответ написан
Ваш ответ на вопрос

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

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