2015-05-20 82 views
2

嗨!Typescript內部模塊 - 無法在同一模塊內引用導出的類

首先,對不起,如果之前有人問過,我嘗試了一些谷歌搜索,但無法找到任何東西(至少沒有我認爲是同一個問題)。我是新手稿,所以仍然要抓緊!

我正在做一個小遊戲作爲一個項目來刷新我的JavaScript,並決定使用Typescript,因爲它似乎很適合模塊化我的應用程序。它全部運行在節點服務器上 - 如果需要,我可以提供版本號!

我有兩個文件,player.tsscene.ts,這些都屬於同一個模塊(他們是我的計劃的一部分,但我想他們分手了模塊化的緣故):

player.ts

module TheGame { 
    export class Player { 
     name: string; 
     constructor(name: string) { 
      this.name = name; 
     } 
    } 
} 

scene.ts

///<reference path="player.ts"/> 
///<reference path="../typings/threejs/three.d.ts"/> 
import jquery = require("three"); 

module TheGame { 
    export class Scene { 
     player: any; 
     constructor() { 
      this.player = new Player('test'); 
     } 
     //Use of Three throughout file 
    } 
} 

這兩個文件都在同一個文件夾,當我嘗試對它們進行編譯:

tsc player.ts scene.ts --module commonjs 

我得到的錯誤:

testscene.ts(10,22): error TS2095: Could not find symbol 'Player'. 

如果我刪除了參考和導入到三,這編譯罰款,但顯然我需要在課堂上使用三。 (在播放器類中也需要三個,可能更晚一些)看起來它實際上編譯JS文件,即使有錯誤,我不知道爲什麼。

  • 我不理解這是如何工作的?

  • 使用外部模塊和內部 模塊有一些限制嗎?

  • 有沒有一種方法來導入所有的外部類我的應用程序 需求(三,socket.io等),在它自己的TS文件,使這項工作, 如果這是一個解決方案?

在此先感謝!

回答說:

的解決方案是,使用CommonJS的,你需要明確的出口和進口,並採用模塊並沒有真正意義(感謝@ssube和@BGR的解決方案)。

工作代碼:

球員。TS

export class Player { 
    name: string; 
    constructor(name: string) { 
     this.name = name; 
    } 
} 

export = Player; 

scene.ts

///<reference path="../typings/threejs/three.d.ts"/> 
import jquery = require("three"); 
import Player = require("./player"); 

class Scene { 
    player: Player; 
    constructor() { 
     this.player = new Player('test'); 
    } 
    //Use of Three throughout file 
} 

export = Scene; 

回答

3

如果你想使用CommonJS的(我想你應該)你需要明確的出口和進口嘗試

player.ts

class Player { 
    name: string; 
    constructor(name: string) { 
     this.name = name; 
    } 
} 

export = Player 

scene.ts

///<reference path="../typings/threejs/three.d.ts"/> 
import jquery = require("three"); //I guess 'jquery' is a typo 
import Player = require('./Player') 

class Scene { 
    player: any; //any -> Player ? 
    constructor() { 
     this.player = new Player('test'); 
    } 
    //Use of Three throughout file 
} 

export = Scene //if this makes sense 
  • 使用包裝modules(如TheGame)的使用CommonJS的時候就沒有真正意義(東西都是孤立的)

  • 你不需要引用。 ts文件

+0

太棒了!這工作,但我必須改變require('./ Player')require('./ player') - 我猜這只是引用.ts文件的名稱(不帶.ts)? –

+1

是的:它是不帶ts擴展名的.ts文件的名稱 –

+0

非常感謝您的幫助,現在就開始工作。標記爲答案 –

1

既然你已經將它們定義爲模塊,即使它們在同一個文件中,它也不可見於TheGame。這就是模塊的目的和力量。

您需要從在scene.ts以使其在該範圍內可見。根據您的輸出結果,這可能會轉化爲AMD或CommonJS的要求。

引用該文件使編譯意識到該定義並允許驗證,但實際上並未將這些符號拉入當前範圍並使其可用。

我會建議作出Player從文件的缺省導出到進口簡化成:

///<reference path="player.ts"/> 
///<reference path="../typings/threejs/three.d.ts"/> 
import jquery = require("three"); 
import Player = require("player"); 
+0

所以我說的正確,即使他們在相同的模塊名稱,他們不會看到對方,因爲他們在物理上不同的模塊塊?我想作爲@BGR在另一個答案中提到,無論如何,在commonJS中使用模塊是沒有意義的 –