如何基于泛型类型“T”初始化TypeORM存储库



我想启动一个基于泛型类型的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[]>

最新更新