从其他文件导入时无法解析Typescript装饰器的签名

时间:2017-07-31 10:14:25

标签: javascript typescript

鉴于以下内容:

decorator.ts

export function logStuff(target: Object, key: string | symbol, descriptor: TypedPropertyDescriptor<any>) {
    return {
        value: function (...args: any[]) {
            args.push("Another argument pushed");
            descriptor.value.apply(target, args);
        }
    };
}

Shell.ts

// Removed other imports for brevity
import logStuff = require("utils/log-decorator");

class Shell extends AnotherClass {
    constructor() {
        super();
        this.fooMethod("arg1");
    }

    @logStuff
    private fooMethod(arg1: string, arg2?: string) {
        console.log(`Arguments from original function: ${JSON.stringify(arguments)}`);
    }
}

export = Shell;

我收到此消息(为简洁起见缩短了文件路径):

  

无法在调用时解析方法装饰器的签名   表达。无法调用类型缺少调用的表达式   签名。输入&#39; typeof   &#34; / utils的/登录装饰&#34;&#39;具有   没有兼容的呼叫签名

但是,如果我将函数移动到Shell.ts的顶部,它将编译没有错误。关于如何处理这个的任何建议?

1 个答案:

答案 0 :(得分:2)

您的logStuff可用作模块的导出成员。所以你必须像以下一样访问它:

import logStuffModule = require("utils/log-decorator");
//...
@logStuffModule.logStuff
private fooMethod(arg1: string, arg2?: string) { ... }

或使用ES6风格的导入:

import { logStuff }  from "utils/log-decorator";

// ...
@logStuff
private fooMethod(arg1: string, arg2?: string) { ... }

<小时/> 或者您可以通过将导出对象设置为您的函数来修改模块,并将其用作现在如何使用它:

// decorator.ts
export = function logStuff() {}

// Shell.ts    
import logStuff = require("utils/log-decorator");

// ...
@logStuff
private fooMethod(arg1: string, arg2?: string) { ... }