我想启动一个基于泛型类型的TypeORM存储库。
例如:
import { Connection, Repository } from 'typeorm';
export class GenericService<T> {
private repository: Repository<T>;
constructor(connection: Connection) {
this.repository = connection.getRepository(T);
// 'T' only refers to a type, but is being used as a value here.ts(2693)
}
public async list(): Promise<T[]> {
return await this.repository.find();
}
}
但是我无法将泛型类型传递给ORM存储库工厂。
如何基于泛型"T"仅指类型,但在此处用作值.ts(2693
类型创建此泛型服务?
附言。我用 C# 就是这样做的,就像一个魅力。它为我节省了很多时间
您不能在 Typescript 中使用类型作为值,因此您需要使用泛型来键入检查值:
import { Connection, Repository } from 'typeorm';
export class GenericService<T> {
private repository: Repository<T>;
constructor(connection: Connection, repo: T) {
this.repository: T = connection.getRepository(repo);
}
public async list(): Promise<T[]> {
return await this.repository.find();
}
}
我使用EntityTarget
类型来避免此错误。代码如下所示:
import { Connection, Repository, EntityTarget } from 'typeorm';
export class GenericService<T> {
private repository: Repository<T>;
constructor(connection: Connection, repo: EntityTarget<T>) {
this.repository = connection.getRepository<T>(repo);
}
public async list(): Promise<T[]> {
return await this.repository.find();
}
}
> 2023 年更新
(打字稿^0.3.17
,打字稿5.1.3
(
根据typeorm存储库(5152,9331(中发布的几个问题,几乎所有以前的解决方案或其部分都被弃用(例如, Connection
(,甚至由于类型演变而不再工作。
另一种方法是将Entity
自身作为通用<T>
传递:
export class GenericService<T extends EntityTarget<ObjectLiteral>> {
private entityManager: EntityManager;
private repository: Repository<ObjectLiteral>;
constructor(entity: T) {
this.repository = this.entityManager.getRepository(entity);
}
public async list() {
return await this.repository.find();
}
}
请注意,对于此示例list()
返回类型将是 Promise<ObjectLiteral[]>
,而不是 Promise<T[]>
。