【问题标题】:How to create Generic Entity Subscriber如何创建通用实体订阅者
【发布时间】:2022-01-24 22:58:25
【问题描述】:

我正在与 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)
 }
}

此代码只能监听用户实体的事件。他们是否有任何通用的方式来设计这个类,以便它监听所有实体。

我已经与 TS 中的 Generic 类一起工作

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' 只指一个类型,但在这里被用作一个值。ts(2693)

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

【问题讨论】:

    标签: typescript postgresql nestjs typeorm nestjs-config


    【解决方案1】:

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

    如果你将类传递给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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-03
      • 2019-06-27
      • 1970-01-01
      • 2016-03-09
      • 1970-01-01
      相关资源
      最近更新 更多