2013-05-09 43 views
2

我想在.ts文件中引用另一個.ts文件。在我的真實項目中,我只需要這種類型安全性(覆蓋繼承的成員進行正確編譯)。參考.ts文件僅用於類型檢查

我的示例:

Test1.ts:

export class Test1 { 

} 

Test2.ts:

/// <reference path="Test1.ts" /> 
export class Test2 { 
    abc: Test1; // ERROR: Test1 could not be found 
} 

這是不可能的? 我想避免導入,因爲它是開銷我不需要在輸出的JavaScript文件中。

UPDATE:我用測試1作爲AMD模塊,它的類測試1被實例化並受底層框架注入類的Test2的一個實例。這就是爲什麼我需要出口的關鍵字,但不想直接導入模塊類型1 - 我只需要引用類,以避免編譯器錯誤和有型的安全等。

回答

1

你必須要添加的類別中模塊,因此它可以通過其模塊被外界引用。

實施例: Test1.ts

module SomeModule { 
    export class Test1 { 
    } 
} 

Test2.ts

/// <reference path="Test1.ts" /> 
export class Test2 { 
    abc: SomeModule.Test1; 
} 

任選地可以添加的Test2到相同的 「命名空間」,然後引用測試1,而不指定模塊名稱:

module SomeModule { 
    export class Test2 { 
     abc: Test1; 
    } 
} 
+0

雖然我同意你關於使用AMD,這個問題並沒有提及這個具體的需求,這就是爲什麼我的答案直接關於如何導出和消費另一個.ts文件避免導入的問題 - 正如問題所述。 根據TypeScript規範「導出聲明聲明可從外部訪問的模塊成員」,因此導出的類應該是模塊的成員。 – jfoliveira 2013-05-09 22:06:57

+0

如果他在不使用模塊加載器的情況下執行'export class Test2',他將在運行時得到'exports not defined'錯誤。 – basarat 2013-05-09 22:12:24

+0

嗯,考慮到它解決了作者在給定場景中的當前情況,我的答案被拒絕投票是很奇怪的。如果這是更好的答案或不是由作者決定,但看到它被拒絕投票有點令人沮喪。 – jfoliveira 2013-05-09 22:25:35

3

,不使用模塊加載

出口關鍵字在你的文件的根目錄,如果你使用的是一些模塊模式(AMD/CommonJS的)纔有意義。如果您不是下面的工作:

Test1.ts:

class Test1 { // Do not use export 

} 

Test2.ts:

/// <reference path="Test1.ts" /> 
class Test2 { 
    abc: Test1; // No Error 
} 

但是,如果你這樣做,你有責任確保Test1.js在Test2.js之前加載,可能使用腳本標記。

注意:如果您在不使用模塊加載程序的情況下使用根級導出,例如,:

export class Test2 { 
} 

生成的JavaScript:

var Test2 = (function() { 
    function Test2() { } 
    return Test2; 
})(); 
exports.Test2 = Test2; 

錯誤因爲出口不被任何定義。

如果你使用AMD(或CommonJS的)

然後你需要用進口來告訴加載器加載該文件:

Test1.ts:

export class Test1 { 

} 

Test2.ts:

// no reference to other ts required.  
import mod = module("Test1"); // Instead you need to load the module 

export class Test2 { 
    abc: mod.Test1; // Reference by module 
} 

此外

在AMD降落每個文件一個模塊。所以我寧願不要在文件內部有一個模塊,因爲這是另一個級別的重定向。即我需要做importedFile.module.class而不是importedFile.class其中importedFile會是什麼,我選擇來調用導入的文件(我把它叫做在給定的例子mod

+0

我必須使用兩個文件/模塊作爲AMD模塊...實際導入是由底層框架完成的,我只需要類型安全...您寫下「如果您使用的是AMD - 那麼您需要使用導入」 。有沒有辦法避免這種限制? – 2013-05-10 23:20:20

+0

我向你展示了你在生成的JS中得到的錯誤。你可能會聲明'exports'是一個var來修復JS錯誤。但是你仍然無法簡單地''參考'這個文件,所以TS問題將會保留 – basarat 2013-05-10 23:30:01