如何创建通用实体订阅者

How to create Generic Entity Subscriber

我正在使用 NestJs 和 typeorm 以及 Postgres 数据库开发一项功能来保存 json 在实体中更新的内容(维护更新和插入日志)。

我正在尝试使用 typeorm 的实体订阅者功能,这对一个实体来说工作正常,但我想创建一个通用订阅者来监听所有更新并插入实体事件

我正在关注这个article

@EventSubscriber()
export class HistorySubscriber implements EntitySubscriberInterface<User> {

listenTo(): any {
    
    return User ;
}

afterUpdate(event: UpdateEvent<User>): Promise<any> | void {
    console.log(event.entity)
 }
}

这段代码只能监听User实体的事件。他们是否以任何通用的方式设计这个 class 以便它监听所有实体。

我已经在 TS

中使用 Generic class
export class HistorySubscriber<T> implements EntitySubscriberInterface<T> {

    listenTo(): any {
        
        return T ;
    }

    afterUpdate(event: UpdateEvent<T>): Promise<any> | void {
        console.log("event========================>",Object.keys(event),event.entity)
    }
}

但收到此错误

'T' only refers to a type, but is being used as a value here.ts(2693)

请提出解决方案或更好的方法。

T 只是一种类型,User 既是一种类型(实例类型)也是一种值(您可以在运行时使用 new 运算符调用的构造函数).类型在编译时被擦除,所以当你说 return T 时,在运行时实际上没有 return 的信息,因为 T 只是一个类型。

如果你将 class 传递给 HistorySubscriber

的构造函数,你可以制作一个通用版本
@EventSubscriber()
export class HistorySubscriber<T> implements EntitySubscriberInterface<T> {

  constructor(private cls: new (...a:any) => T) {

  }
  listenTo(): any {
    return this.cls;
  }

  afterUpdate(event: UpdateEvent<T>): Promise<any> | void {
    console.log(event.entity)
  }
}

class User { }
class Product{ }

new HistorySubscriber(User);
new HistorySubscriber(Product);

Playground Link