Javascript Typescript装饰器:将实例字段添加到类中以在同一类中使用

Javascript Typescript装饰器:将实例字段添加到类中以在同一类中使用,javascript,typescript,logging,decorator,lombok,Javascript,Typescript,Logging,Decorator,Lombok,我目前正在学习打字脚本装饰程序。我的第一个目标是将Lombok项目中的@Slf4J在Java中的功能复制到Typescript中。其思想是使用@logger注释/修饰一个类,以便在同一个类中接收LogUtil类型的字段日志,以便调用log.info() LogUtil类: 导出类LoggerUtil{ logLevel:logLevel; 构造函数(日志级别:日志级别){ this.logLevel=logLevel; } 错误(类名:string,消息:string){ 如果(this.log

我目前正在学习打字脚本装饰程序。我的第一个目标是将Lombok项目中的@Slf4J在Java中的功能复制到Typescript中。其思想是使用@logger注释/修饰一个类,以便在同一个类中接收LogUtil类型的字段日志,以便调用log.info()

LogUtil类:

导出类LoggerUtil{
logLevel:logLevel;
构造函数(日志级别:日志级别){
this.logLevel=logLevel;
}
错误(类名:string,消息:string){
如果(this.logLevel>=logLevel.ERROR){
错误(`${new Date()}[error]${className}:${message}`);
}
}
警告(类名:string,消息:string){
如果(this.logLevel>=logLevel.WARN){
log(`${new Date()}[WARN]${className}:${message}`);
}
}
日志(类名:string,消息:string):void{
log(`${new Date()}[log]${className}${message}`)
}
信息(类名:string,消息:string):无效{
如果(this.logLevel>=logLevel.INFO){
log(`${new Date()}[INFO]${className}:${message}`)
}
}
调用(类名:string,消息:string){
如果(this.logLevel>=logLevel.INFO){
log(`${new Date()}[CALL]${className}.${message}`)
}
}
调试(类名:string,消息:string){
if(this.logLevel>=logLevel.DEBUG){
log(`${new Date()}[DEBUG]${className}:${message}`)
}
}
}
日志级别枚举:

export enum LogLevel {
    ERROR = 0,
    WARN = 1,
    INFO = 2,
    DEBUG = 3
}
示例类使用@logger decorator将LoggerUtil的实例获取为log

@记录器
导出类服务{
示例函数(){
log.info(“调用的exampleFunction”)
}
}
我目前正试图用类级装饰器来实现这一点。在这里,我尝试做不同的事情:

使用Reflect API在类上定义属性。在这里,我甚至不确定这是否有效

导出函数记录器(){ 返回函数(目标:函数){ Reflect.defineProperty(目标,“log”{value:new-LoggerUtil(LogLevel.DEBUG)}) } } 使用类原型定义属性:

导出函数记录器(){ 返回函数(目标:函数){ target.prototype.log=新的LoggerUtil(LogLevel.DEBUG); } } 在引用服务中的日志实例时,每种方法都会出现“找不到名称‘log’”:

@记录器
导出类服务{
示例函数(){
log.info(“调用的exampleFunction”)//找不到名称“log”
}
}
我的想法可能吗?我有没有遗漏一些基本的东西


提前感谢您的反馈

我找到了一种至少能满足我需求的方法:

我选择了继承(这是我想要避免的)。请参见以下示例:

@记录器
导出类SomeService扩展记录器{
构造函数(){
超级()
}
示例函数(){
log.info(“调用的exampleFunction”)
}
}
然后,我扩展的超类如下所示:

@记录器
导出类记录器{
log:LoggerUtil;
}
最后,装饰师看起来是这样的:

导出函数记录器(构造函数:T){
返回类扩展了构造函数{
log=newloggerutil(LogLevel.DEBUG);
}
}
我的想法是通过继承将字段日志添加到SomeService。为了现在初始化这个字段,我在超类上使用了decorator。decorator本身返回一个类,该类使用初始化字段扩展decorator类。通过这种方式,将创建以下继承图:

@记录器(装饰器)->记录器(超类)->SomeService

我可以在超级类记录器本身中初始化日志字段。然而,这是为了调查装饰者,并希望从长远来看删除超级类


作为参考,我想指出有关如何覆盖构造函数的说明。

欢迎使用so。也许看看吧,谢谢!我觉得这个解决方案在我的情况下不起作用,因为我想在同一个类中使用方法/字段,而不首先创建实例。因此,就我所知,我无法利用继承。