MikroORM:如何将通用 findOne 与 BaseEntity 一起使用?

MikroORM: How to use generic findOne with BaseEntity?

我们正在使用 MikroORM,并希望在我们的 NestJS 项目中使用一些基本方法创建一个 BaseRepo。这样做我们 运行 遇到了 findOne 方法的问题。这是我们的代码:

BaseRepo.ts

export class BaseRepo<T extends BaseEntity> {
    constructor(protected readonly em: EntityManager) {}

    async findOneById(id: string): Promise<T> {
        const entity = await this.em.findOne(T, id); // ts complains here
        return entity;
    }
}

BaseEntity.ts

export abstract class BaseEntity {
    @PrimaryKey()
    _id!: ObjectId;

    @SerializedPrimaryKey()
    id!: string;
}

TypeScript 在 findeOne 的 T 参数上给我们以下错误:'T' only refers to a type, but is being used as a value here.ts(2693).

所以 TypeScript 似乎无法将 T 识别为实体。有什么办法让它起作用吗?

您需要使用值,而不是类型。类型在运行时不存在,您需要一个运行时值。基本存储库应包含实体名称,您应该使用它。

export class BaseRepo<T extends BaseEntity> {
    constructor(protected readonly em: EntityManager, protected entityName: EntityName<T>) {}

    async findOneById(id: string): Promise<T> {
        const entity = await this.em.findOne(this.entityName, id);
        return entity;
    }
}