我们可以在 NestJS 中为 TypeORM 扩展多个类吗?

I'm*_*tik 5 typescript typeorm nestjs

我面临着一种情况,我想扩展多个课程。我命名了类 A a.entity.ts,并将该类扩展为BaseEntity(这是 typeORM 中的预定义类),如下所示:

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

    @Column()
    title: string;

    @Column({length: 100, nullable: true})
    description: string;
}
Run Code Online (Sandbox Code Playgroud)

abstract class DateAudit另外,我对审核日期有自己的习惯,如下所示:

export abstract class DateAudit {
    
    @CreateDateColumn()
    created: Date;
  
    @UpdateDateColumn()
    updated: Date;
  }
Run Code Online (Sandbox Code Playgroud)

我想将其与A 类中的类DateAudit一起使用,例如:BaseEntity

导出类 A 扩展 BaseEntity、DateAudit

我知道多重继承是不可能的。期待知道如何实现这种场景。

提前致谢!

coj*_*ack 8

您可以按如下方式进行:

export abstract class DateAudit extends BaseEntity {
    
    @CreateDateColumn()
    created: Date;
  
    @UpdateDateColumn()
    updated: Date;
  }
Run Code Online (Sandbox Code Playgroud)

那么您的实体将执行以下操作:

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

    @Column()
    title: string;

    @Column({length: 100, nullable: true})
    description: string;
}
Run Code Online (Sandbox Code Playgroud)


You*_*uba 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 {}
Run Code Online (Sandbox Code Playgroud)

实施它:

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

    @Column()
    title: string;

    @Column({length: 100, nullable: true})
    description: string;
}
Run Code Online (Sandbox Code Playgroud)

ps:受到github解决方案的启发


解决方案2:使用嵌入式实体

在你的例子中,我们将扩展baseEntity,另一方面,我们将创建一个类auditEntity

    export class DateAudit {
    
    @CreateDateColumn()
    created: Date;
  
    @UpdateDateColumn()
    updated: Date;
  }
Run Code Online (Sandbox Code Playgroud)

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

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

    @Column()
    title: string;

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

   @Column(type => DateAudit )
    audit: DateAudit ;
}
Run Code Online (Sandbox Code Playgroud)

ps: colmun 将audit作为前缀
source :embedded-entities