箭头函数的TypeScript类装饰器

箭头函数的TypeScript类装饰器,typescript,typescript-typings,javascript-decorators,Typescript,Typescript Typings,Javascript Decorators,我正在尝试跟踪Typescript类中的方法调用。类似于: 代码正确打印出greet1方法的方法跟踪,但不打印greet2箭头函数的方法跟踪。我认为它被视为一个类别属性 关于如何打印greet2函数跟踪的任何指针 输出: > ts-node test.ts getOwnPropertyNames - methodName: constructor getOwnPropertyNames - methodName: greet1 Call Greeter.greet1, args: ["te

我正在尝试跟踪Typescript类中的方法调用。类似于:

代码正确打印出
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'))

这是不可能的,如果您查看生成的代码,您将看到箭头函数是在构造函数中创建的,它们不是原型的一部分

因此,当decorator运行时,它不知道箭头函数

为此,必须创建另一个decorator,如
@logMethod
,并将其应用于方法声明。在这种情况下,decorator将应用于属性,arrow函数本质上是一个属性