Javascript Typescript方法返回未定义的方法修饰符

Javascript Typescript方法返回未定义的方法修饰符,javascript,typescript1.8,Javascript,Typescript1.8,如果这是一个愚蠢的问题,我道歉。我是新的打字脚本和学习打字脚本装饰。我找到了一个代码:MethodDecorator来记录参数和结果 原木装饰器 function log (target: Object, key: string, descriptor: TypedPropertyDescriptor<any>) { let originalMethod = descriptor.value; descriptor.value = function (...args:

如果这是一个愚蠢的问题,我道歉。我是新的打字脚本和学习打字脚本装饰。我找到了一个代码:MethodDecorator来记录参数和结果

原木装饰器

function log (target: Object, key: string, descriptor: TypedPropertyDescriptor<any>) {
    let originalMethod = descriptor.value;
    descriptor.value = function (...args:any[]) {
        //before
        console.log(`${key} method called with args: ${JSON.stringify(args)}`);

        let result = originalMethod.apply(this, args);

        //after
        console.log(`${key} method return value: ${JSON.stringify(result)}`);
    }
    return descriptor;
}
所有代码都可以正常工作,但当我运行此代码时,getId返回undefined

我的tsconfig.json

{
    "compilerOptions": {
        "target": "es5",
        "module": "commonjs",
        "removeComments": false,
        "experimentalDecorators": true
    }
}
要编译并运行:

tsc -p ./
node book.js
输出:

getId method called with args: []
getId method return value: 1
Book before setId:
Book {id: 1, title: 'Learn TypeScript', publisher: 'O\'Reilly Media' }
Favourite book id: undefined
setId method called with args: [5]
setId method return value: undefined
Book after setId:
Book {id: 5, title: 'Learn TypeScript', publisher: 'O\'Reilly Media' }
Favourite book id: undefined
我无法理解为什么setId能像我所希望的那样工作,而getId不能

tsc -v: Version 1.8.10

我不知道为什么互联网上的所有帖子都引用了这样的例子,但是我自己在方法decorator上下文中遇到了关于
originalMethod.apply(这个,args)的问题

这确实根本不起作用(我不知道这是
ts
bug还是什么)

在尝试一个错误后,我发现以下解决方案有效,允许您在基类中拥有正确的上下文:

function myDecorator(target: Object, key: string, descriptor: TypedPropertyDescriptor<any>) {

        descriptor.value = function (...args:any[]) {
            // whatever code suits you here...
            // dont use "this", use "target"
            let result = originalMethod.apply(target, args);

        }
        return descriptor;
}

干杯

天哪,我原以为你的问题和我一样,但事实并非如此

问题的原因是重新定义函数时,您没有返回任何内容

这是您的原始代码块:
descriptor.value=函数(…参数:任意[]){
//以前
log(`${key}方法用args调用:${JSON.stringify(args)}`);
让结果=originalMethod.apply(这是args);
//之后
log(`${key}方法返回值:${JSON.stringify(result)}`);
}
现在,将其返回,它将正常工作。
descriptor.value=函数(…参数:任意[]){
//...
让结果=originalMethod.apply(这是args);
//...
返回结果;//在此处添加!!!
}

我也有同样的问题。找到答案了吗?将目标作为参数传递将提供类原型,而不是实际实例。使用
这可能是大多数人想要的,但一定要使用实际函数而不是箭头函数。
tsc -v: Version 1.8.10
function myDecorator(target: Object, key: string, descriptor: TypedPropertyDescriptor<any>) {

        descriptor.value = function (...args:any[]) {
            // whatever code suits you here...
            // dont use "this", use "target"
            let result = originalMethod.apply(target, args);

        }
        return descriptor;
}
export class Yeah {
    @myDecorator()
    helloWord() {
        let n = 5;
        return this.multiply(n);
    }

    multiply(a: number) {
       return a * 2;
    }

}