You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 09:10:38