TypeORM升级到3.x后,自定义仓库如何添加构造函数或替代功能?
TypeORM 3.x自定义仓库无法添加构造函数的解决办法
TypeORM 3.x废弃了@EntityRepository装饰器,改用dataSource.getRepository().extend()的方式扩展自定义仓库,但这种方式不支持直接在扩展对象中定义constructor——这就是你遇到AssertionError: repositoryConstructor is not a constructor错误的核心原因:extend是基于已有的Repository实例扩展方法,而非创建新的构造函数类。
下面提供两种可行的替代方案:
方案一:用初始化方法替代构造函数
把原来构造函数里的逻辑抽成一个初始化方法,在仓库创建完成后手动调用:
// 扩展自定义仓库方法 export const UserRepository = dataSource.getRepository(User).extend({ // 自定义初始化方法 async init() { // 原来构造函数中的逻辑写在这里 console.log("UserRepository初始化完成"); return this; // 返回自身支持链式调用 }, async findUser() { // 自定义业务逻辑 return this.findOne({ where: { id: 1 } }); }, }); // 在数据源初始化完成后调用初始化方法 await dataSource.initialize(); await UserRepository.init();
方案二:回到类继承模式(支持依赖注入)
如果需要依赖注入或者更贴近旧版的类写法,可以直接创建继承自Repository的类,然后在DataSource配置中注册:
// 定义自定义仓库类 export class UserRepository extends Repository<User> { constructor(dataSource: DataSource) { super(User, dataSource.manager); // 原来构造函数中的逻辑写在这里 console.log("UserRepository构造函数执行"); } async findUser() { return this.findOne({ where: { id: 1 } }); } } // 配置DataSource时注册自定义仓库 const dataSource = new DataSource({ type: "mysql", host: "localhost", port: 3306, username: "root", password: "password", database: "test", entities: [User], repositories: [UserRepository], // 注册自定义仓库 }); // 初始化数据源后获取仓库实例 await dataSource.initialize(); const userRepository = dataSource.getRepository(UserRepository);
关键说明
extend()方法本质是给现有Repository实例添加方法,不是定义新类,所以不能用constructor。- 类继承模式更适合需要依赖注入的场景,而
extend()更适合快速扩展简单的自定义方法。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

