You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 19:40:10