typeorm generi c ошибка репозитория при расширении BaseEntity - PullRequest
0 голосов
/ 14 июля 2020

У меня проблема с машинописным текстом при создании общего c репо. Я хочу принудительно вводить тип, применяя тип TEntity generi c для расширения 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 машинописный текст жалуется при передаче Entity в качестве параметра этого функция

ошибка: Тип «BaseEntity» не может быть присвоен типу строка | Функция | (новый () => TEntity) | EntitySchema '.

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

Это довольно неприятно, поскольку мне нужно передать строку, которая представляет имя Entity (который является классом) в качестве временного решения.

Странно то, что если я использую этот метод не в классе c, он отлично работает. Как вы можете видеть ниже, объект 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()

Что мне здесь не хватает?

1 Ответ

0 голосов
/ 16 июля 2020

Я нашел решение, используя 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()
    );

Однако теперь у меня есть другая проблема с типами. Я создал Entity, реализующий интерфейс. НО, я не могу напрямую сохранить объект этого интерфейса в сущности, я должен сначала преобразовать его, а затем вставить.

Я не понимаю, почему 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
...