如何在类中获取静态方法的名称?

时间:2019-05-08 08:03:21

标签: typescript

我在静态方法中打印了许多日志,并且我想使用方法名称作为上下文。但是我不想声明一个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

3 个答案:

答案 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'

Code sample

答案 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();