typeorm преобразовать EntitySchema в Entity

Я использую машинописный текст и печатную форму. У меня есть эта сущность:

import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export class Sample {

    @PrimaryGeneratedColumn()
    id: number;

    @Column({ length: 50 })
    name: string;

    @Column('text', { nullable: true })
    description: string;
}

Я запрашиваю один результат вроде этого:

const connection = await this.getConnection();
const sampleRepo = await connection.getRepository(Sample);
const sample = await sampleRepo.createQueryBuilder('sample')
    .where('sample.id = :id', { id: id })
    .getOne();

Теперь мне нужно сделать кое-что с столбцами результатов, но образец объекта имеет тип EntitySchema. Итак, в машинописном тексте я не могу сделать sample.id, потому что ошибка:

Property 'id' does not exist on type 'EntitySchema<any>'

Есть ли способ преобразовать EntitySchema в реальный объект Sample?


person Troncoso    schedule 18.08.2020    source источник
comment
Я предполагаю, что ваш sampleRepo неправильно создан. Должно получиться что-то вроде getRepository(Sample)   -  person Aluan Haddad    schedule 19.08.2020
comment
Я добавил, как создаю репозиторий   -  person Troncoso    schedule 19.08.2020
comment
Хм, это должно сработать. Это то, что написано в документации   -  person Aluan Haddad    schedule 19.08.2020
comment
Вы можете начать с попытки: const sample = await getRepository (Sample) .createQueryBuilder ('sample') .where ('sample.id =: id', {id: id}) .getOne (); `Объединение этих обещаний может иметь неблагоприятный эффект и где-то нарушать ссылку.   -  person Charles Desbiens    schedule 19.08.2020


Ответы (1)


Как оказалось, это из-за плохой реализации. Я вынес создание репозитория в отдельный класс:

export default class Database {
    private connectionManager: ConnectionManager

    constructor() {
        this.connectionManager = getConnectionManager();
    }

    public getRepository<T extends EntitySchema>(type:  ObjectType<T> | EntitySchema<T> | string): Promise<Repository<T>> {
        const connection = await this.getConnection();
        return connection.getRepository(type);
    }

    public async getConnection(connectionName = 'default'): Promise<Connection> {
        let connection: Connection;

        if (this.connectionManager.has(connectionName)) {
            connection = this.connectionManager.get(connectionName);

            if (!connection.isConnected) {
                connection = await connection.connect();
            }
        }
        else {
            const connectionOptions: ConnectionOptions = Object
                .assign({ name: connection }, connectionProperties);

            connection = await createConnection(connectionOptions);
        }

        return connection;
    }
}

Похоже, connection.getRepository не возвращает обещание. Кроме того, общий T не должен расширять EntitySchema. Чтобы функция работала так, как задумано, мне пришлось написать ее так:

public getRepository<T>(type:  ObjectType<T> | EntitySchema<T> | string): Promise<Repository<T>> {
    return new Promise((resolve, reject) => {
        this.getConnection().then(conn => {
            resolve(conn.getRepository(type));
        }).catch(reject);
    });
}
person Troncoso    schedule 19.08.2020