繁体   English   中英

如何在 typescript 的方法装饰器中访问参数名称(或将参数作为对象获取)?

[英]How to access parameter names (or get args as an object) in method decorator in typescript?

我正在尝试访问方法装饰器中的参数名称。

function log(filter: string[] = []) {
  return function(
    target: any,
    propertyKey: string,
    descriptor: PropertyDescriptor,
  ) {
    const originalFunc = descriptor.value;

    descriptor.value = async function(...args: any[]) {
      this.logger.log(
        `Start ${propertyKey} function`,
        `${this.constructor.name}.${propertyKey}`,
      );

      // filter is parameter names: to not log them

      this.logger.verbose(
        `${propertyKey} function Input Parameters is ${args}`,
      );

      const result = await originalFunc.apply(this, args);

      this.logger.verbose(`${propertyKey} function returned: ${result}`);
      this.logger.log(`End ${propertyKey} function`);
      return result;
    };

    return descriptor;
  };
}

我想做的是编写一个记录器装饰器。 这个装饰器将记录方法名称及其参数,以及方法运行后的结果。 这没问题,但我还想过滤记录的参数。

我们不知道我们会得到什么参数,或者有多少参数会导致这个装饰器被用于各种方法。

我能想到的一种方法是获取参数名称。 例如:如果该方法具有三个参数arbitraryMethod(name: string, age: number, married: boolean) ,我想将其作为以下内容:

argNames = ['name', 'age', 'married'];
argValues = ['Jack', 23, false];

或者通过这种方式获取:

const args {
  name: 'Jack',
  age: 23,
  married: false
};

还有一些其他的过滤方法,即获取索引而不是参数名称,并根据它进行过滤,但它不会优雅和漂亮,而且可能有点难以使用。 所以我避免使用这种方法。

如果有的话,我愿意接受任何其他解决方案。 提前致谢。

一旦您想使用原始的 function,就可以在装饰器内部访问参数数组,因为它们都在args[]参数中

descriptor.value = function (...args: any[]) {
   // now you can access to args[0, 1...]

   // Call the original function if needed
   return originalValue.apply(this, args);
};

希望这可以帮助,

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM