TypeScript class 箭头函数装饰器
TypeScript class decorator for arrow function
我正在尝试跟踪 Typescript 中的方法调用 class。类似于:https://github.com/aiteq/trace
代码为 greet1
方法正确地打印出方法跟踪,但对于 greet2
箭头函数却没有。我相信它被视为 class 属性。
关于如何打印出 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在运行的时候,并不知道箭头函数。
为此,您必须创建另一个装饰器,如 @logMethod
并将其应用于方法声明。在那种情况下可能会起作用,装饰器将应用于 属性,箭头函数本质上是 属性.
我正在尝试跟踪 Typescript 中的方法调用 class。类似于:https://github.com/aiteq/trace
代码为 greet1
方法正确地打印出方法跟踪,但对于 greet2
箭头函数却没有。我相信它被视为 class 属性。
关于如何打印出 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在运行的时候,并不知道箭头函数。
为此,您必须创建另一个装饰器,如 @logMethod
并将其应用于方法声明。在那种情况下可能会起作用,装饰器将应用于 属性,箭头函数本质上是 属性.