簡體   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