2017-07-31 42 views
1

鑑於以下導入時解決打字稿裝飾的簽名:無法從另一個文件

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; 

我得到這個消息(爲簡潔起見,縮短了文件路徑):

當作爲 表達式調用時,無法解析方法裝飾器的簽名。無法調用其類型缺少呼叫 簽名的表達式。類型「的typeof ‘/ utils的/註銷裝飾’」有沒有 兼容調用簽名

但是,如果我移動功能Shell.ts的頂部,它編譯沒有錯誤。有關如何處理這個問題的任何建議?

回答

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) { ... }