TypeORM-NestJS多实体继承报错求助:无法继承多个类
解决TypeScript+TypeORM多继承报错问题
你遇到的报错是因为TypeScript不支持多类继承,一个类只能extends单个父类,所以Users extends BaseModel,AuditModel这种写法是非法的。下面给你两种实用的解决方案:
方案一:合并通用基类(最直观简单)
把BaseModel和AuditModel的字段合并成一个基类,让业务实体直接继承这个合并后的类:
// src/baseModels/BaseAuditModel.ts import { Entity, PrimaryGeneratedColumn, CreateDateColumn, UpdateDateColumn, DeleteDateColumn } from "typeorm"; @Entity() export class BaseAuditModel { @PrimaryGeneratedColumn("uuid") id: string; @CreateDateColumn() created!: Date; @UpdateDateColumn() updated!: Date; @DeleteDateColumn() deletedAt?: Date; }
修改Users实体继承这个合并后的类:
import { BaseAuditModel } from 'src/baseModels/BaseAuditModel'; import { Entity, Column } from 'typeorm'; @Entity() export class Users extends BaseAuditModel { @Column({ unique: true }) email: string; @Column({ nullable: false }) name: string; @Column({default:false}) isActive: boolean; @Column({ select: false }) password: string; }
方案二:使用TypeScript混入(保持基类独立性)
如果想保留BaseModel和AuditModel的独立结构,可以用TypeScript的混入(Mixin)实现类似多继承的效果,同时要注意混入类不需要加@Entity装饰器:
首先修改两个基类,移除@Entity:
// src/baseModels/BaseModel.ts import { PrimaryGeneratedColumn } from "typeorm"; export class BaseModel { @PrimaryGeneratedColumn("uuid") id: string; }
// src/baseModels/AuditModel.ts import { CreateDateColumn, DeleteDateColumn, UpdateDateColumn } from "typeorm"; export class AuditModel { @CreateDateColumn() created!: Date; @UpdateDateColumn() updated!: Date; @DeleteDateColumn() deletedAt?: Date; }
然后通过混入函数组合两个基类的属性到Users:
import { Entity, Column } from 'typeorm'; import { BaseModel } from 'src/baseModels/BaseModel'; import { AuditModel } from 'src/baseModels/AuditModel'; // 定义混入构造器类型 type Constructor<T = {}> = new (...args: any[]) => T; // 封装BaseModel的混入函数 function withBase<TBase extends Constructor>(Base: TBase) { return class extends Base implements BaseModel { @PrimaryGeneratedColumn("uuid") id: string; }; } // 封装AuditModel的混入函数 function withAudit<TBase extends Constructor>(Base: TBase) { return class extends Base implements AuditModel { @CreateDateColumn() created!: Date; @UpdateDateColumn() updated!: Date; @DeleteDateColumn() deletedAt?: Date; }; } // 组合混入并定义Users实体 @Entity() export class Users extends withAudit(withBase(class {})) { @Column({ unique: true }) email: string; @Column({ nullable: false }) name: string; @Column({default:false}) isActive: boolean; @Column({ select: false }) password: string; }
两种方案里,方案一适合大多数简单场景,代码维护成本低;方案二更灵活,适合需要拆分通用逻辑的复杂项目。
内容的提问来源于stack exchange,提问作者user20181423
相关产品推荐
相关产品推荐

