2012-11-20 98 views
5

有些人正在使用Backbone.d.ts編寫Backbone應用程序。我想討論兩個用例。環境聲明樣式和模塊

  1. 創建具有使用AMD裝載機使用純JS

對於那些在營地1模塊(或CommonJS的我想以及)

  • 創建骨幹應用骨幹應用中,必要的是,主鏈模塊定義爲外部模塊,以便模塊能夠導入幷包含在define()包裝中。

    對於那些在營地2,有必要將主幹模塊定義爲內部模塊以便使用智能感知,而不要求使用import聲明/ define()包裝。

    問題:有沒有其他的方式來定義模塊,以便它可以在兩種情況下使用?


    我真的不希望有創建一個叉只是讓你可以有

    // required for those using import (1) 
    declare module "Backbone" { 
    

    // required for those not using import (2) and backbone already exists in the global scope 
    declare module Backbone { 
    

    ,仍然能夠相處你代碼/智能感知。

  • 回答

    2

    這不能只用一個.d.ts文件,因爲編譯器需要知道什麼樣的模塊來完成系統,你知道用什麼樣的代碼來生成主幹。您可以在單個文件中混合並匹配內部和外部模塊,並且無法正確猜測您正在爲骨幹網使用哪些模塊。

    您可能可以使用interface聲明,以便您可以在一個位置聲明大部分內容,並具有「backbone-internal.d.ts」和「backbone-external.d.ts」文件,該文件引用該公共聲明文件,但是您可以這樣做的程度取決於API的表面區域的樣子。

    TL; DR:營1和營2並不相互排斥,即使在同一個文件中。

    2

    我已經提出這與TypeScript團隊,他們已經打開了一個工作項目。

    我建議,如果你寫的所有模塊使用...

    module MyModule { 
    } 
    

    ...包裝,如果您發送模塊標誌的編譯器,如果它的文件相匹配,應該剝離模塊聲明名稱。通過這種方式,您可以編寫一個模塊,該模塊可以被編譯爲可以在網頁,CommonJS或AMD上工作而不需要修改。

    最初討論在這裏,它已被轉移到一個工作項目:

    http://typescript.codeplex.com/discussions/401397

    +0

    其實,這是非常不同的東西。您的請求是關於生成JavaScript的模塊。這個問題是關於'declare module'用於向編譯器聲明類型。 –