#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>
.