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
我知道多重继承是不可能的。期待知道如何实现这种场景。
提前致谢!
您可以按如下方式进行:
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)
解决方案 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
| 归档时间: |
|
| 查看次数: |
8121 次 |
| 最近记录: |