2015-08-08 50 views
0

一直快樂地開發利用與CommonJS的外部模塊「附加」模塊類的打字稿幾個月如下:導出混合型和模塊

exports = JQ; 

class JQ { 
    a = 0; 
} 

module JQ { 
    export class HelpClass {} 
    export interface Something {} 
} 

我喜歡這種模式,因爲它使包含在文件的模塊,減少進口數量,並且仍然暴露一個不錯的API。

現在,我不想導出一個類,而想導出一個混合類型,以便它可以用作其他函數和類「內部」的函數,例如jQuery,Underscore和許多其他庫。

我知道如何聲明以及如何在TypeScript中創建混合類型,但是不管用附加模塊導出它。我確實獲得了正確發佈的JS代碼,但編譯器抱怨。

例如,這樣的:

export = JQ; 

var JQ = <JQ.JQStatic>function (a:string) { return a; }; 
JQ.method = function() { return 1; }; 

module JQ { 
    export interface JQStatic { 
     (a:string):string; 
     method() :number; 
    } 

    // Additional class here 
    export class SomethingElse {} 
} 

生產什麼樣子的權利JS代碼(外觀酷似如果JQ是一個類,而不是混合型產生的一個),但編譯器爲重複的識別符錯誤,智能感應器停止工作。

如果我刪除附加類SomethingElse,它工作正常,所以我想這是導出混合類型的特例。

我測試了它也打字稿遊樂場並得到了相同的結果:儘管class JQvar JQ都在發出一個JS var JQ,當它是一類打字稿允許和接受它,否則不是。

我試圖做什麼不受支持?但是,由於發佈的JS是有效的,所以它是編譯器中的一個功能,如果這被報告爲TypeScript開發人員的缺陷?

回答

0
function JQ(a: string) { return a; } 

module JQ { 
    export class SomethingElse { } 

    export function method() { return 1; } 
} 

export = JQ; 

https://github.com/Microsoft/TypeScript/wiki/Declaration-Merging

+0

這工作得很好,但它導出一個單一的功能,而不是一個混合類型的實例。主要區別在於,這裏的方法()完全是靜態的,而在混合類型中,它可以在閉包內部具有一個狀態,併產生具有不同閉包的不同實例。我重新審視了我的代碼以支持這種缺陷,但仍然認爲它缺少打字稿,應該支持。 –