Как я могу расширить модель мангуста ?

#mongodb #typescript #mongoose

#mongodb #машинопись #мангуст

Вопрос:

Используя mongoose и typescript, я хочу создать базовое хранилище, в котором я мог бы избежать дублирования кода, такого как create, list, update и delete .

Итак, это то, что у меня есть:

Модель

 import mongoose, { Document, Schema } from 'mongoose';

export interface ILog extends Document {
    description: string;
}

const LogSchema: Schema = new Schema({
  description: { type: String, required: true, unique: true }
});

export default mongoose.model<ILog>('Log', LogSchema);
  

Репозиторий

 export class LogRepository extends BaseRepository<Log> {
  protected model = Log;
}
  

Базовое хранилище

 import { Document, Model } from 'mongoose';

export abstract class BaseRepository<T extends Model<T>> {
  protected abstract model: T;

  public find (): Promise<T[]> {
    return this.model.find().exec();
  }

  public create (body: any): Promise<T> {
    const data = new T(body);
    return data.save();
  }

  public update (id: string, body: any): Promise<T | null> {
    return this.model.findByIdAndUpdate(id, body).exec();
  }

  public async delete (id: string): Promise<number | undefined> {
    const res = await this.model.deleteOne({ _id: id }).exec();
    return res.n;
  }
}
  

Но в BaseRepository я получаю Type 'T' does not satisfy the constraint 'Document' ;

Кроме того, как я могу создать новый T (при методе создания)?

Ответ №1:

Вы не можете вызвать new T() , потому что T — это тип. Если this.model это класс, то вы хотите вызвать const data = new this.model(body);

В основном это работает:

 export abstract class BaseRepository<T extends Document> {
  protected abstract model: Model<T>;

  public create (body: any): Promise<T> {
    const data = new this.model(body);
    return data.save();
  }
  

Но я не уверен, как выглядит ваш Log тип.

Комментарии:

1. Log это export default mongoose.model<ILog>('Log', LogSchema);

2. Теперь я получаю 'Log' refers to a value, but is being used as a type here. Did you mean 'typeof Log'?ts(2749)

3. Я предположил Log , что это тип, потому что вы используете его как тип, когда делаете extends BaseRepository<Log> . Вещь внутри скобок здесь должна быть типом. Это должно сработать: export class LogRepository extends BaseRepository<ILog> { protected model = Log; } потому что ваша модель Log соответствует необходимому типу Model<ILog> .