我在静态方法中打印了许多日志,并且我想使用方法名称作为上下文。但是我不想声明一个context
变量并为其分配函数/方法名称。
我想通过访问方法名称来使用上下文。不仅在类静态方法中,而且在每个函数中。
这是我的尝试:
class CloudFunction {
public static parse() {
console.log(this.name); // CloudFunction
console.log(CloudFunction.parse.name); // get nothing here
// Don't want to declare `context` variable and assign method name to it.
const context = 'parse';
logger.debug('a log', { context, arguments: 'pubsubMessage' });
//... many logs use this context
// want the better way like this:
// const self = this;
// logger.error(new Error('bad'), {context: self.name })
}
}
CloudFunction.parse();
它们都不起作用。我可以使用reflect
的方式获得它吗?我不确定reflect
可以做到这一点。
更新
这是我的结果:
☁ DL-Toolkits [master] npx ts-node /Users/ldu020/workspace/github.com/mrdulin/ts-codelab/src/class/get-static-method-name/index.ts
CloudFunction
答案 0 :(得分:1)
我正在获取方法的名称,还是我误会了什么?
class ClassWithStaticMethod {
static staticMethod() {
console.log('1: ' + ClassWithStaticMethod.staticMethod.name); // output: '1: staticMethod'
return ClassWithStaticMethod.staticMethod.name;
}
}
console.log('2: ' + ClassWithStaticMethod.staticMethod()); // output: '2: staticMethod'
答案 1 :(得分:0)
我认为这是因为static方法之前的public access修饰符。
class CloudFunction {
static parse() {
console.log(this.name); // CloudFunction
console.log(CloudFunction.parse.name); // get nothing here
const context = 'parse';
}
}
CloudFunction.parse();
此代码无需访问修饰符即可工作
答案 2 :(得分:0)
我认为没有简单的方法可以得到这个。
创建一个新的静态变量以存储current
函数名称,并在调用函数时使用修饰符更改此变量。
function changeContextName(target: object, propertyName: string, propertyDesciptor: PropertyDescriptor) {
let method = propertyDesciptor.value;
propertyDesciptor.value = function() {
// let prevMethod = this.context; // backup previous method name
this.context = propertyName;
method.apply(this, arguments);
// this.context = prevMethod; // restore previous method name
};
}
class CloudFunction {
public static context: string;
@changeContextName
public static parse() {
console.log({context: this.context});
}
@changeContextName
public test() {
console.log({ context: CloudFunction.context});
}
}
CloudFunction.parse();
(new CloudFunction()).test();