2014-03-29 136 views
7

如何將JavaScript AMD模塊導入外部TypeScript模塊?如何將JavaScript AMD模塊導入外部TypeScript模塊?

我將我的客戶端TypeScript程序模塊化以使用由bower管理的AMD模塊。 作爲這個過程的一部分,Typescript模塊成爲一個JavaScript AMD模塊,然後我發佈。 現在我有一個JavaScript AMD模塊,我想包含在TypeScript模塊中,而且我不想用JavaScript AMD發佈原始TypeScript。

我無法弄清楚如何編寫我的TypeScript代碼,以便加載一個沒有對應的TypeScript的JavaScript AMD模塊,並且看來最新版本的TypeScript還不支持這一點。

如果我開始與來自0.9.7打字稿說明書的例子中,部分11.2:

文件main.ts:

import log = require("./log"); 
log.message("hello"); 

文件log.ts:

export function message(s: string) { 
    console.log(s); 
} 

我相信我應該能夠修改main.ts,以便編譯器解析對log.js AMD模塊的「日誌」引用。 以下是運行tsc --module amd main.ts生成的log.js文件。這是一個正確的AMD模塊。

文件log.js:

define(["require", "exports"], function(require, exports) { 
    function message(s) { 
     console.log(s); 
    } 
    exports.message = message; 
}); 

爲了模擬具有一個JavaScript AMD模塊,編譯上述例子中,並刪除文件log.ts。 如果現在嘗試使用同一命令來編譯時,出現以下錯誤:

./main.ts(1,1): error TS2071: Unable to resolve external module '"./log"'. 
./main.ts(1,1): error TS2072: Module cannot be aliased to a non-module type. 

如何我現在可以修改main.ts所以它編譯並解決針對此log.js AMD模塊? 如果需要,我可以編寫log.d.ts文件,但是想要一個沒有聲明文件的方法。

如果我可以學會如何在規範的TypeScript方法中做到這一點,那麼我可以繼續我的項目的完整模塊化。

回答

2

我該如何修改main.ts以便加載和使用這個log.js AMD模塊?

如果唯一可用的log.js您可以使用declare即創建一個log.d.tslog告訴類型的信息打字稿:

declare module 'log'{ 
    export function message(s:string); 
} 

,然後用它從main.ts爲:

/// <reference path='log.d.ts'/>  

import log = require('log'); 
log.message("hello"); 
+0

這就像你寫的一樣。但是如果我保留原始示例中的名稱「./log」,那麼它將無法編譯。我搜索了語言規範並找到了第12.1.6節「環境外部模塊聲明」,它描述了模塊名稱是頂級(非相對)名稱的限制。但是,我無法找到解釋爲什麼這是如此。我只能猜測這樣的命名沒有真正的需要? 你有解釋這個限制嗎?謝謝 – psnider

+0

Js文件應該來自npm或來自您的RequireJS配置。這兩種情況下的名稱都不是相對的 – basarat

+0

我發現使用字符串作爲AMD模塊名稱的要求令人困惑,但發現這篇文章描述了用法:https://typescript.codeplex.com/wikipage?title=Modules 20英寸%%20TypeScript – psnider