首页 > 解决方案 > 扩展 BaseEntity 时的 typeorm 通用存储库错误

问题描述

创建通用存储库时,我在打字稿中遇到问题。我想通过强制 TEntity 泛型类型来扩展 BaseEntity 来强制键入,如下所示:

@EntityRepository()
export class ClsGEntitiesRepository<TEntity extends BaseEntity> {
    private _dbConnection: Connection;
    private _entity: TEntity;

    constructor(entity: TEntity,  dbConnection: Connection) {
        this._dbConnection = dbConnection;
        this._entity = entity;
    }

但是,当尝试使用 getRepository 时,打字稿在将实体作为此函数的参数传递时会抱怨

错误:类型 'BaseEntity' 不可分配给类型 'string | 功能 | (新()=> TEntity)| 实体架构'。

const rootQuery = this._dbConnection
            .getRepository<TEntity>(this._entity)  <--error 
            .createQueryBuilder()

这很烦人,因为我需要传递一个字符串,它代表实体(它是一个类)的名称作为解决方法。

奇怪的是,如果我在非泛型类中使用此方法,它工作正常。正如您在下面看到的那样,实体“TestEntity”正在扩展 BaseEntity,我可以在 getRepo 中毫无问题地使用它

@Entity({
    name: "testentity",
})
export class TestEntity extends BaseEntity implements ITestEntity {
    @PrimaryColumn({
        type: "uuid",
        nullable: false,
    })
    resourceId: string;
    @Column({
        type: "float",
        nullable: true,
        default: 0.0,
    })
    value: number;
}


    const a = dbConnection
    .getRepository<TestEntity>(TestEntity) <--no error
    .createQueryBuilder()

我在这里想念什么?

标签: typescriptrepositorytypeorm

解决方案


在参数中定义实体时,我找到了使用 ObjectType 的解决方案:

@EntityRepository()
export class ClsGEntitiesRepository<
    TEntity extends BaseEntity
> extends Repository<TEntity> {
    private _dbConnection: Connection;
    private _entityName: string;
    private _entity: ObjectType<TEntity>; <--this fixed the issue

    constructor(entity: ObjectType<TEntity>, dbConnection: Connection) {
        super();
        this._dbConnection = dbConnection;
        this._entity = entity;
        this._entityName = this._dbConnection.getMetadata(this._entity).name;
    }
}

//example of usage
const TestEntityRepository = new ClsGEntitiesRepository<TestEntity>(
        TestEntity,
        getConnection()
    );

但是现在我有另一个问题,类型。我创建了一个实现接口的实体。但是,我不能直接在实体中保存这个接口的对象,我必须先转换它,然后才能插入它。

我不明白为什么 TypeScript 在实体实现接口时抱怨。

要重现错误:

import { BaseEntity, Column, Entity, PrimaryColumn } from "typeorm";

interface ITest {
    id: string;
    val: number;
}

@Entity({
    name: "theentity",
})
class TheEntity extends BaseEntity implements ITest {
    @PrimaryColumn({
        type: "character varying",
        nullable: false,
        default: "def",
    })
    id: string;

    @Column({
        type: "bigint",
        nullable: true,
    })
    val: number;
}

const record: ITest = {
        id: "id1",
        val: 2,
    };

const records: ITest[] = [record];

// TheEntity.save(records); <--complains

TheEntity.save(records as TheEntity[]); <--not complains and inserting fine in the table

推荐阅读