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

Dan*_*tos 7 generics typescript 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();
    }

}
Run Code Online (Sandbox Code Playgroud)

但我无法将泛型类型传递给 ORM 存储库工厂。

'T' 仅指类型,但在这里被用作值。ts(2693

如何基于通用类型创建此通用服务?

附言。我用 C# 确实做到了这一点,而且效果非常好。它节省了我很多时间

Yey*_*des 6

您不能在 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();
   }
    
}
Run Code Online (Sandbox Code Playgroud)


Leo*_*zyk 5

通常我使用EntityTargettype 来避免这个错误。代码如下:

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();
   }

}
Run Code Online (Sandbox Code Playgroud)