Я недавно понял, что с помощью typeorm, когда я отделяю свое определение сущности от моего класса модели и использую соответствующий репозиторий, некоторые методы, например findOne
, возвращают простые объекты вместо экземпляров класса модели. Я хотел бы знать, является ли это ожидаемым поведением или я что-то теряю в своей реализации.
Следующий код воспроизводит описанную ситуацию:
import { EntitySchema, createConnection } from 'typeorm'
class Nameable {
id: number
name: string
}
const NameableSchema = new EntitySchema<Nameable>({
name: 'nameable',
columns: {
id: { type: Number, primary: true, generated: 'increment' },
name: { type: String }
}
})
createConnection({
type: "postgres",
host: "localhost",
port: 5432,
username: "logbook",
password: "logbook",
database: "logbook",
entities: [ NameableSchema ],
synchronize: true
})
.then(databaseConnection => databaseConnection.getRepository(NameableSchema))
.then(nameableRepository => nameableRepository.findOne({ where: { id: 1 }}))
.then(findedNameable => console.log(findedNameable))
В этом случае, учитывая, что в моей базе данных есть постоянный кортеж, значение id которого равно 1, console.log(findedNameable)
печатает из следующего:
{ id: 1, name: 'NameableName' }
Однако я ожидал чего-то подобного:
Nameable { id: 1, name: 'NameableName' }
Я провел несколько тестов с использованием декораторов в своем классе моделей и, насколько я мог видеть, в этом случае все экземпляры, возвращаемые методами репозитория, были экземплярами из моего соответствующего класса модели. В этом примере с использованием декораторов действительно показано ожидаемое поведение:
import { createConnection, Entity, PrimaryGeneratedColumn, Column } from 'typeorm'
@Entity()
class Nameable {
@PrimaryGeneratedColumn()
id: number
@Column()
name: string
}
createConnection({
type: "postgres",
host: "localhost",
port: 5432,
username: "username",
password: "password",
database: "database",
entities: [ Nameable ],
synchronize: true
})
.then(databaseConnection => databaseConnection.getRepository(Nameable))
.then(nameableRepository => nameableRepository.findOne({ where: { id: 1 }}))
.then(findedNameable => console.log(findedNameable))
Что происходит, так это то, что я действительно хотел бы отделить определения своих сущностей от своих моделей, поэтому я пока не рассматривал возможность использования декораторов для решения этой проблемы ,
Кроме того, я не смог найти в документации ничего, указывающего на то, что наличие отдельного определения сущности может повлиять на поведение классов репозитория.