我正在NestJS
为包装器编写一个包装器,Typegoose
因为不再支持现有的包装器,并且我想在我的实现中消除一个关键缺陷。
任务:有一个装饰器@EventTrackerFor(schema: AnyClass)
接受类Typegoose
。在引擎盖下它的工作原理是这样的:
export const EventTrackerFor = (schema: AnyClass) =>
applyDecorators(Injectable, SetMetadata('tracker-for', schema.name));
以及装饰器@Pre(eventName: PreEvents)
和@Post(eventName: PostEvents)
,它们的实现方式如下:
export const Post = (eventName: PreEvents) => SetMetadata('post', eventName);
export const Pre = (eventName: PostEvents) => SetMetadata('pre', eventName);
结果,库的用户将如下所示:
@EventTrackerFor(User)
class UserEventTracker {
constructor(private readonly anyService: AnyService) {}
@Pre(PreEvents.SAVE)
@Post(PostEvents.SAVE)
logOnAndAfterCreate() {
console.log('user created')
}
}
// ------------------------ Любой модуль
@Module({
imports: [MyModule.forFeature([ {schema: User} ])],
providers: [UserEventTracker]
})
class AnyModule {}
您需要以某种方式从装饰器中提取值@EventTrackerFor()
,以及此提供者的方法中标有装饰器@Pre()
和的方法@Post()
,包括传递给这些装饰器的值。
我试图在各种包中查看这种行为的实现,例如@nestjs/bull
,但是到处都有这么多的代码,我无法理解他们仍然是如何做到的。