TypeORM中EntitySchema配合私有构造函数的实例化问题
解决TypeORM EntitySchema结合私有构造函数的实例化问题
问题根源是EntitySchema的target属性必须指向构造函数(类本身),而非静态方法,你设置User.create自然会触发this.target is not a constructor错误。同时,TypeORM默认会直接调用构造函数实例化对象,但你的User构造函数是私有,因此需要通过factory选项自定义实例化逻辑来解决。
解决方案步骤:
1. 在User类中添加专属静态实例化方法
静态方法可以访问类的私有构造函数,新增一个供TypeORM调用的方法,接收转换后的ValueObject数据:
export default class User extends AggregateRoot { readonly #id: UserId; #name: UserName; #mail: UserEmail; #status: UserStatus; private constructor( id: UserId, name: UserName, mail: UserEmail, status: UserStatus, ) { super(); this.#id = id; this.#name = name; this.#mail = mail; this.#status = status; } // 原有业务创建方法 public static create( id: string, name: string, mail: string, status: boolean, ) { const userId = new UserId(id); const userName = new UserName(name); const userMail = new UserEmail(mail); const userStatus = new UserStatus(status); return new User(userId, userName, userMail, userStatus); } // 新增:供TypeORM调用的实例化方法,接收转换后的实体数据 public static fromEntityData({ id, name, mail, status }: { id: UserId; name: UserName; mail: UserEmail; status: UserStatus; }) { return new User(id, name, mail, status); } get id() { return this.#id; } get name() { return this.#name; } get mail() { return this.#mail; } get status() { return this.#status; } }
2. 修改EntitySchema配置,指定target和factory
将target指向User类本身,同时通过factory覆盖默认实例化逻辑:
export const UserSchema = new EntitySchema<User>({ name: 'users', target: User, // 必须指向User类(构造函数) columns: { id: { primary: true, type: String, transformer: ValueObjectTransformer(UserId), }, name: { type: String, transformer: ValueObjectTransformer(UserName), }, mail: { type: String, transformer: ValueObjectTransformer(UserEmail), }, status: { type: Boolean, transformer: ValueObjectTransformer(UserStatus), }, }, // 自定义实例化:用转换后的ValueObject创建User实例 factory: (data) => User.fromEntityData(data), });
核心原理:
target设置为User类,满足TypeORM对实体元数据的校验要求,避免构造函数类型错误。factory选项会接管TypeORM的实例化流程:查询时,先通过transformer将数据库原始值转换为对应的ValueObject,再调用factory方法传入转换后的数据,最终返回完整的User实例,而非普通对象。- 原有
User.create方法可继续用于业务代码中从原始字符串/布尔值创建实例,与TypeORM的实例化逻辑完全解耦。
内容的提问来源于stack exchange,提问作者sverdejot
相关产品推荐
相关产品推荐

