如何创建通用实体订阅者
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);
我正在使用 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 classexport 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);