2012-10-19 88 views
8

如果我使用/// <reference path="..."/>語法引用TypeScript聲明文件(例如jquery.d.ts),那麼我需要確保通過其他方式加載相應的庫,即只引用.d.ts文件不會加載庫。在TypeScript中使用import/require來獲取接口聲明

當我使用它時,有什麼方法可以使TypeScript爲庫生成一個require()調用?如果我沒有使用AMD/requirejs,我可以手動撥打require,但我想讓它與AMD合作。

這樣做的好處是我的依賴不會在兩個地方定義。從.ts文件引用庫足以確保加載,而不必在我的HTML中手動維護依賴列表。

更新:我打開了一個new question,闡明瞭我的確切情況。因爲我沒有提供所有必要的細節,所以我想給出我原來的問題的答案。

回答

6

是的,TypeScript支持「外部」模塊,它基本上是一流的AMD或CommonJS模塊。例如:

MyLib.ts

export function foo() { return 'bar' } 

MyProj.ts

import lib = module('./MyLib.ts') 
lib.foo(); // returns bar 

與 「--module AMD」 編譯這一點,你會得到適當的模塊,需要爲你生成語法。

+1

模塊對於直接提供函數和變量的庫非常適用,但我需要類似的庫來擴展jQuery插件等現有功能。沒有什麼可以導出,但加載它們會在JQuery界面上添加額外的調用(在jquery.d.ts中定義) – dcstraw

+0

公平地說,我認爲你的答案適用於我原來的問題。我只是沒有完全指定我的問題。我會將其標記爲答案並提出更清晰的問題。 – dcstraw

1

我寫了something關於我的博客。您還可以在GitHub上找到示例。

該解決方案需要很長時間才能解釋,但基本上我使用帶有Require.JS的墊片來定義表示要加載的Javascript庫的模塊名稱。然後我創建一個具有相同名稱的TypeScript文件,以使TypeScript編譯器生成可以使用我想要的JS庫的Javascript代碼。這不是真的有意義,但請閱讀這篇文章,我認爲它會更有意義。

+0

感謝您的回覆。不過,我認爲這不能解決我的問題。該解決方案仍假定庫至少有一個頂級調用,以便TypeScript將在'define'調用中生成依賴關係。我沒有任何頂級方法或變量,因爲這些庫是擴展現有功能的插件。 另外我不認爲你真的需要在你的例子中使用墊片。如果您只需在underscore.js旁邊創建underscore.d.ts,則可以導入'libs/underscore'模塊,TypeScript將使用.d.ts文件。 – dcstraw

+0

d.ts文件僅由Typescript用於確定您的代碼是否正確鍵入。基本上它只是一個接口,所以沒有代碼由Typescript編譯器生成。您必須以某種方式提供Javascript庫的實現。一種解決方法是在HTML中引用Javascript文件,就像你不想做的那樣。另一個解決方案是使用AMD異步加載它。這是我提出的解決方案。 – Absolom

+0

瞭解,但我仍然認爲你的解決方案由於墊片而不必要的複雜。 – dcstraw