2015-12-03 79 views
3

我的Visual Studio 2015年社區Node.js的+工具 我已經創建了「空白Node.js的控制檯應用程序」打字稿項目我的名字空間沒有定義。打字稿

我已經增加了一個打字稿文件,TypeScript1.ts並提出以下幾點:

module MyModule { 
    export class Calculator { 
     add(x: number, y: number): number { 
      return x + y; 
     }; 
     constructor() { } 
    } 
} 

在主文件,app.ts我把這個:

/// <reference path="TypeScript1.ts" /> 
console.log('Hello world'); 
var subject: MyModule.Calculator; 
subject = new MyModule.Calculator(); 
var result: number = subject.add(2, 3); 
console.log(result); 

它建立沒有問題,但是當我嘗試調試/運行,它指出:

ReferenceError: MyModule is not defined 
    at Object.<anonymous> (C:\Users\User\Documents\Visual Studio 2015\Projects\NodejsConsoleApp1\NodejsConsoleApp1\app.js:8:15) 

我該怎麼做?

回答

0

我會檢查app.js的內容,如果它包含代碼從TypeScript1.ts文件。我的猜測是,它沒有。

可以按如下方式來解決它運行tsc

tsc --module commonjs --target es5 --outFile app.js TypeScript1.ts app.ts 

請注意--outFile選項。

+0

感謝您回答Martin.app.js不包含它實際上,我不需要運行這個文件,我嘗試使用Mocha測試TypeScript1.ts文件並獲得了同樣的錯誤爲什麼我的app.js不包含TypeScript1的代碼? –

+0

嗯,這是因爲TS編譯器假定你要麼使用內部模塊es,在這種情況下,'/// '註釋僅用於從由'--outFile'參數指定的最終文件中的'.ts'文件中正確地命令腳本。或者,您可以根據需要使用「輸入」模塊的外部模塊。 (有用的資源http://www.typescriptlang.org/Handbook#modules-splitting-across-files) –

+0

謝謝,我在發佈問題之前閱讀了這篇文章,儘管我完全理解它是相當尷尬的。對我來說是內部還是外部?所有文件都在單個項目中。我如何才能實現自動構建Mocha測試以測試TypeScript1.ts? –

0

我相信有一些問題(假設打字稿1.5+):

第一:/// <reference path="TypeScript1.ts" />

應該是:import MyModule from "./TypeScript1";

其次,我相信你需要export module MyModule

或者你可以做變化

module MyModule { 
     export class Calculator { 
      add(x: number, y: number): number { 
       return x + y; 
      }; 
      constructor() { } 
     } 
    } 

 export default class Calculator { 
      add(x: number, y: number): number { 
       return x + y; 
      }; 
      constructor() { } 
     } 

然後import Calculator from "./TypeScript1";

或者交替

 export class Calculator { 
      add(x: number, y: number): number { 
       return x + y; 
      }; 
      constructor() { } 
     } 

然後import {Calculator} from "./TypeScript1";

分別根據其上面您選擇。

第一個創建Calculator類作爲主要導出,如果計算器是您計劃保留在文件中的主要內容,那麼它很有用,如果計劃在文件中有多個同等重要的東西,則第二個是有用的。

此外,模塊關鍵字一般不會再使用,而是使用命名空間關鍵字,因爲模塊關鍵字太混亂,太多人將其與文件導入模塊混淆。

+0

您好,MBeatty,謝謝您的回覆。我編輯過TypeScript1.ts: export class Calculator add(x:number,y:number):number { return x + y; }; 構造函數(){} } 和app.ts: 從「TypeScript1.ts」導入計算器 console.log('Hello world'); var subject:MyModule.Calculator; subject = new MyModule.Calculator(); var result:number = subject.add(2,3); console.log(result); Visual Studio強調「TypeScript1.ts」並指出「無法找到模塊'TypeScript1.ts'」。 App1和TypeScript1都位於同一個文件夾中。 –

+0

值得嘗試的兩件事:從導入語句中刪除「.ts」擴展名和/或用「./」作爲前綴,下次我接近我的TypeScript開發設置時,我會嘗試一下,但如果你打我在這裏張貼,我會確保適當地編輯答案。 – MBeatty

+0

是的,看起來像添加「./」應該修復它。您可以保留或關閉「.ts」。公約將是離開它。所以約定會從「TypesScript1」導入計算器; – MBeatty

0

命名空間的工作,甚至沒有引用... 我用這樣的事情...

sript1。TS

namespace A{ 
     class AA{ 
      var x:number; 
      constructor(x:number){ 
        this.x=x; 
      } 
     } 
} 

script2.ts

var y:A.AA = new A.AA(3); 

命名空間會工作,即使這些文件是在項目的不同的文件夾。我沒有引用或導入任何東西。

0

它現在2017年的聖誕節,他們仍然還沒有確定這個> :( 亞歷山大的解決方案是正確的「Visual Studio代碼」使用您tsconfig.json文件如下:。

"compilerOptions": { 
    "emitDecoratorMetadata": true, 
    "experimentalDecorators": true, 
    "module": "system", 
    "outFile": "bundle.js", 
    "target": "es5" 
}, 

你然後運行捆綁文件「node bundle」