我们能否在NestJS中为TypeORM扩展多个类?

5

我遇到了一个情况,我想要扩展多个类。我有一个名为a.entity.ts的A类,并将其扩展到BaseEntity(这是typeORM中预定义的类),如下所示:

@Entity()
export class A extends BaseEntity{
    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    title: string;

    @Column({length: 100, nullable: true})
    description: string;
}

此外,我有自己的自定义抽象类 DateAudit,用于记录日期审核的目的,如下所示:

export abstract class DateAudit {
    
    @CreateDateColumn()
    created: Date;
  
    @UpdateDateColumn()
    updated: Date;
  }

我想在类A中使用DateAuditBaseEntity类,例如:

export class A extends BaseEntity,DateAudit

我知道多重继承是不可能的。期待了解如何实现这种情况。

提前感谢!


对于一些正在寻找解决方案的人来说,这个链接可能会有所帮助- https://dev59.com/uF8d5IYBdhLWcg3wVQ69 - zemil
2个回答

8
你可以按照以下步骤进行:
export abstract class DateAudit extends BaseEntity {
    
    @CreateDateColumn()
    created: Date;
  
    @UpdateDateColumn()
    updated: Date;
  }

然后你的实体将会执行:

@Entity()
export class A extends DateAudit {
    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    title: string;

    @Column({length: 100, nullable: true})
    description: string;
}

6

解决办法 1
要在TypeORM中继承列,你需要编写一个抽象类,让实体继承自该抽象类,在您的情况下,可以这样做:

    export type Constructor<T = {}> = new (...args: any[]) => T;

export function BaseEntity<TBase extends Constructor>(Base: TBase) {
    abstract class AbstractBase extends Base {
        @PrimaryGeneratedColumn()
          id: number;

        @Column()
         title: string;

       @Column({length: 100, nullable: true})
        description: string;
    }
    return AbstractBase;
}

export function DateAudit<TBase extends Constructor>(Base: TBase) {
    abstract class AbstractBase extends Base {
        @CreateDateColumn()
            created: Date;

        @UpdateDateColumn()
           updated: Date;
    }
    return AbstractBase;
}

export class EmptyClass {}

实现它的方法如下:
    @Entity()
export class A extends DateAudit(BaseEntity(EmptyClass)){
    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    title: string;

    @Column({length: 100, nullable: true})
    description: string;
}

注:灵感来自于GitHub上的解决方案


解决方法2:使用嵌入实体

在您的情况下,我们将扩展baseEntity,另一方面,我们将创建一个auditEntity类。

    export class DateAudit {
    
    @CreateDateColumn()
    created: Date;
  
    @UpdateDateColumn()
    updated: Date;
  }

然后我们可以在实体中连接这些列:

       @Entity()
export class A extends BaseEntity {
    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    title: string;

    @Column({length: 100, nullable: true})
    description: string;

   @Column(type => DateAudit )
    audit: DateAudit ;
}

提示:该列将以审核为前缀
来源:嵌入式实体


感谢@youba提供的解决方案,这个很好用。唯一的问题是,如果你想在抽象类中建立任何类型的关系,比如ManyToOne,你不能引用EntityWithTenant,因为它不是BaseEntity。假设你有一个TenantType实体类 class TenantType extends BaseEntity { ...@OneToMany(() => EntityWithTenant, entitiyWithTenant => entitiyWithTenant.tenantType) entityWithTenant: EntityWithTenant }那么有没有什么解决方法呢? - mexam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接