使用 TypeORM 创建通用存储库
Creating generic repository using TypeORM
我正在使用 typeorm,我想创建一个通用存储库:
import "reflect-metadata";
import { DBManager } from './db-manager';
import { Photo } from './entities/Photo';
import { createConnection, Connection } from "typeorm";
class GenericRepository<T> {
private connection: DBManager;
constructor(connection: DBManager) {
this.connection = connection;
}
public list(): T[] {
let result: T[] = [];
this.connection.connect().then(async connection => {
result = await <Promise<T[]>>(connection.entityManager.find(T));
});
return result;
}
}
let genericReposity = new GenericRepository<Photo>(new DBManager());
genericReposity.list();
此代码当然无法正常工作,并抱怨 find
找不到名称的方法 T
T
应该是我的实体,但我不知道如何实现这个
TypeScript 中的泛型仅在编译类型中,并且在输出 javascript 代码中删除了有关泛型类型的所有信息。这就是为什么它不可能做你想做的。仅当您为通用存储库明确指定类型时才有可能,例如通过构造函数:
import "reflect-metadata";
import { DBManager } from './db-manager';
import { Photo } from './entities/Photo';
import { createConnection, Connection } from "typeorm";
export type ObjectType<T> = { new (): T } | Function;
class GenericRepository<T> {
private connection: DBManager;
private type: ObjectType<T>;
constructor(type: ObjectType<T>, connection: DBManager) {
this.type = type;
this.connection = connection;
}
public list(): T[] {
let result: T[] = [];
this.connection.connect().then(async connection => {
result = await <Promise<T[]>>(connection.entityManager.find(this.type));
});
return result;
}
}
let genericReposity = new GenericRepository(Photo, new DBManager());
genericReposity.list();
另请注意,您可能不希望每次请求实体列表时都连接到数据库。所以我建议重新设计你的 class.
我正在使用 typeorm,我想创建一个通用存储库:
import "reflect-metadata";
import { DBManager } from './db-manager';
import { Photo } from './entities/Photo';
import { createConnection, Connection } from "typeorm";
class GenericRepository<T> {
private connection: DBManager;
constructor(connection: DBManager) {
this.connection = connection;
}
public list(): T[] {
let result: T[] = [];
this.connection.connect().then(async connection => {
result = await <Promise<T[]>>(connection.entityManager.find(T));
});
return result;
}
}
let genericReposity = new GenericRepository<Photo>(new DBManager());
genericReposity.list();
此代码当然无法正常工作,并抱怨 find
找不到名称的方法 T
T
应该是我的实体,但我不知道如何实现这个
TypeScript 中的泛型仅在编译类型中,并且在输出 javascript 代码中删除了有关泛型类型的所有信息。这就是为什么它不可能做你想做的。仅当您为通用存储库明确指定类型时才有可能,例如通过构造函数:
import "reflect-metadata";
import { DBManager } from './db-manager';
import { Photo } from './entities/Photo';
import { createConnection, Connection } from "typeorm";
export type ObjectType<T> = { new (): T } | Function;
class GenericRepository<T> {
private connection: DBManager;
private type: ObjectType<T>;
constructor(type: ObjectType<T>, connection: DBManager) {
this.type = type;
this.connection = connection;
}
public list(): T[] {
let result: T[] = [];
this.connection.connect().then(async connection => {
result = await <Promise<T[]>>(connection.entityManager.find(this.type));
});
return result;
}
}
let genericReposity = new GenericRepository(Photo, new DBManager());
genericReposity.list();
另请注意,您可能不希望每次请求实体列表时都连接到数据库。所以我建议重新设计你的 class.