2014-06-18 49 views
1

我有一個模塊「foo」,我試圖導入到3個不同的文件(使用AMD)。這裏是我的文件夾結構:導入有條件導出的本地模塊

lib/ 
    foo.ts 
views/ 
    view1/ 
     view1.ts 
    view2/ 
     view2.ts 
     sub/ 
      subview2.ts 

我希望能夠設置foo.ts爲None/AMD/CommonJS工作。如果我把「export = foo;」在文件中它不會編譯爲正常使用。我希望能夠將它設置,如下圖所示:

module foo { 
    declare var define: any; 
    declare var module: any; 

    if (typeof define === 'function' && define.amd) { 
     define(() => { 
      return foo; 
     }); 
    } else if (typeof module !== 'undefined' && module.exports) { 
     module.exports = foo; 
    } 
} 

declare module 'foo' { 
    export = foo; 
} 

節點模塊上述工作(因爲一些節點魔法),但它並不適用於本地文件。從我有文件夾結構我需要以下兩個語句的工作。

import foo = require('../../lib/foo'); 

import foo = require('../../../lib/foo'); 

打字稿不喜歡我做的其中任意一個,並會抱怨,除非我用的是以下幾點:

import foo = require('foo'); 

但是這不會在運行時正常工作(除非foo是封裝的節點模塊,否則不是)。我知道我可以進入foo.ts文件並將「export = foo;」在根層面,但我沒有寫foo,而寧願不編輯我沒有寫的東西,以便將來可以輕鬆更新它。

有沒有一個很好的解決方法,或者我錯過了什麼?

回答

0

如果使用別人的JS文件

具有條件的出口

這是一個實現細節在的JavaScript屬於本地模塊沒有了打字稿類型定義(d.ts) 。你foo.d.ts應該是這樣的:

module foo { 
    export var SomePropertyFromFoo:string; 
} 

declare module 'foo' { 
    export = foo; 
} 

節點模塊上述工作(因爲一些節點魔法),但它並不適用於本地文件。

您也可以在這裏使節點的魔法工作。將相應的foo.js文件放在node_modules文件夾中以上您的文件和require('foo')將工作在運行時。現在讓我們來修復編譯時間:

打字稿不喜歡我做的其中任意一個,並會抱怨,除非我用下面的

然後你就可以參考+進口(注:兩者都是要求):

/// <reference path='../foo.d.ts'/> 
import foo = require('foo'); 

而這正是你應該做的外部模塊。

如果你擁有的TS文件

你想要的.ts文件都與模塊的加載和沒有

沒有一個支持的方式,此刻做這個工作。這是一個「或」的主張(內部與外部)。 TypeScript API本身也會遇到這個問題(它是一個基於內部模塊的系統,需要將其導出到commonjs Get TypeScript class in a file and read single parts of it)。

+0

在我的場景中,我實際上有.ts(不是.d.ts和.js)。我正在尋找一種構建.ts的方式,以便我可以在/ withought模塊加載時使用它。 所以說你有一個用TypeScript編寫的庫,你想分發.ts文件而不是分發.d.ts和.js文件。您希望.ts文件可以在模塊加載和不加載的情況下使用。有沒有簡單的方法來做到這一點,或者你需要做些奇怪的事情? – wjohnsto

+0

請參閱更新「如果您擁有ts文件」 – basarat

+0

很高興知道,謝謝! – wjohnsto