Декоратор класса TypeScript для функции стрелки - PullRequest
1 голос
/ 08 января 2020

Я пытаюсь отследить вызовы метода в классе Typescript. Аналогично: https://github.com/aiteq/trace

Код правильно выводит трассировку метода для метода greet1, но не для функции стрелки greet2. Я считаю, что это рассматривается как свойство класса.

Любой указатель на то, как я могу распечатать трассировку для функции greet2?

Вывод:

> ts-node test.ts
getOwnPropertyNames - methodName: constructor
getOwnPropertyNames - methodName: greet1
Call Greeter.greet1, args: ["test1"]
test1
test2

Код:

function logClass(target: any) {

    if (target.prototype) {
        Object.getOwnPropertyNames(target.prototype).forEach((methodName: string) => {
            const original = target.prototype[methodName]
            console.log(`getOwnPropertyNames - methodName: ${methodName}`)
            if (typeof original !== 'function' || methodName === 'constructor') {
                return
            }
            target.prototype[methodName] = function (...args: any[]) {
                const ret = original.apply(this, args)
                console.log(`Call ${target.name}.${methodName}, args: ${JSON.stringify(args)}`)
                return ret
            }
        })
    }
    return target
}

@logClass
class Greeter {

    public greet1(s: string) {
        return s
    }

    public greet2 = (s: string) => {
        return s
    }
}

const greeter = new Greeter()
console.log(greeter.greet1('test1'))
console.log(greeter.greet2('test2'))

1 Ответ

1 голос
/ 08 января 2020

Это невозможно, если вы посмотрите на сгенерированный код, вы увидите, что функции-стрелки созданы в конструкторе, они не являются частью прототипа.

Таким образом, когда работает декоратор, он не имеет представления о Функция стрелки.

Для этого вам нужно создать другой декоратор, такой как @logMethod, и применить его к объявлению метода. Это может сработать, так как в этом случае декоратор будет применен к свойству, функция стрелки по существу является свойством.

...