【问题标题】:Can we extends multiple classes in NestJS for TypeORM?我们可以在 NestJS 中为 TypeORM 扩展多个类吗?
【发布时间】:2021-05-08 15:52:04
【问题描述】:

我遇到了想要扩展多个类的情况。我有一个名为 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;
}

另外,我有自己的自定义abstract class DateAudit 用于审核日期,如下所示:

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

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

导出类 A 扩展 BaseEntity、DateAudit

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

提前致谢!

【问题讨论】:

    标签: typescript nestjs typeorm


    【解决方案1】:

    你可以这样做:

    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;
    }
    

    【讨论】:

      【解决方案2】:

      解决方案 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;
      }
      

      ps:灵感来自 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 ;
      }
      

      ps:colmun 会以audit 作为前缀
      来源:embedded-entities

      【讨论】:

        猜你喜欢
        • 2017-10-04
        • 1970-01-01
        • 2020-11-07
        • 2018-11-05
        • 1970-01-01
        • 1970-01-01
        • 2022-08-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多