typescript - Mongodb, Typegoose - patrón de repositorio genérico
@typegoose/typegoose": "^7.2.0"
¿Hay alguna manera de tener un repositorio CRUD genérico con TypeScript y Typegoose? En particular, ¿cómo hacer que el método getModelForClass() funcione con genéricos? Algo similar a este código tomado de la pregunta 246.
Si es así, ¿qué me estoy perdiendo?
import { prop, getModelForClass } from '@typegoose/typegoose';
import { AnyParamConstructor, ReturnModelType } from '@typegoose/typegoose/lib/types';
export class GenericCRUDService<T, U extends AnyParamConstructor<T> = AnyParamConstructor<T>> {
dataModel: ReturnModelType<U, T>;
constructor(cls: U) {
this.dataModel = getModelForClass<T, U>(cls);
}
public create(data: T) {
this.dataModel.create(data);
}
}
export class Cat {
@prop()
public age: number;
@prop()
public color: string;
}
export class Dog {
@prop()
public isBarking: boolean;
@prop()
public race: string;
}
Respuesta #1
ref: typegoose/typegoose#303
si quieres que una "clase de gestor" y no el modelo real sea genérica, esto es fácil, solo necesitas tener los tipos correctos
Recomendaría escribir la clase así:
// NodeJS: 14.4.0
// MongoDB: 4.2-bionic (Docker)
import { getModelForClass, prop, types, ReturnModelType, DocumentType } from "@typegoose/typegoose"; // @typegoose/[email
import * as mongoose from "mongoose"; // [email @types/[email
export class GenericCRUDService<U extends types.AnyParamConstructor<any>> {
public dataModel: ReturnModelType<U>;
constructor(cls: U) {
this.dataModel = getModelForClass(cls);
}
public create(data: mongoose.CreateQuery<DocumentType<InstanceType<U>>>) {
this.dataModel.create(data);
}
}
export class Cat {
@prop()
public age?: number;
@prop()
public color?: string;
}
export class Dog {
@prop()
public isBarking?: boolean;
@prop()
public race?: string;
}
(async () => {
await mongoose.connect(`mongodb://localhost:27017/`, { useNewUrlParser: true, dbName: "verifyMASTER", useCreateIndex: true, useUnifiedTopology: true });
const CatService = new GenericCRUDService(Cat);
await CatService.create({}); // with type support (since ~@types/[email )
await mongoose.disconnect();
})();
(tu problema al tomar el ejemplo antiguo es que desde la versión 7.1.0 se eliminó el genérico T "innecesario")
