2014-11-03 94 views
1

我已經在模塊內部聲明瞭四十個左右的函數,但也有一個將每個函數複製到全局名稱空間(或提供的任何目標對象)的方法。將模塊函數聲明覆制到全局名稱空間

module JsHamcrest { 
    declare function assertThat(actual: any, matcher: Matcher): void; 

    // lots and lots of Matcher factory methods 
    declare function bool(): Matcher; 
    declare function func(): Matcher; 
    declare function number(): Matcher; 
    declare function object(): Matcher; 
    declare function string(): Matcher; 
    ... 

    declare function copyMembers(target: any): void; 
} 

這允許開發者使用的命名空間功能JavaScript作爲-是通過模塊名稱

JsHamcrest.assertThat(5, JsHamcrest.number()); 

或將它們複製到全局命名空間,以提高可讀性。

JsHamcrest.copyMembers(window); 

assertThat('foo', string()); 

我想出迄今最短的解決方案是將每個功能分配給一個全局變量:

var number = JsHamcrest.number; 

但至少在PhpStorm的JSDoc沒有應用到副本,並且它仍然容易出錯(儘管不那麼)。

tl; dr 如何聲明這些頂層定義而不復制粘貼它們,並仍然使用文檔自動完成IDE?

回答

2

沒有一個方法來「批量」複製成員進入全局命名空間(謝天謝地?),但你可以使用import代替var和應該得到JSDoc信息假設你的編輯器使用的打字稿語言服務:

enter image description here

+0

進口的作品,但PhpStorm不繼承文件或參數類型提示(對那些需要參數):'型腳本導入語句默認地將Impl「布爾」 [jshamcrest.d.ts]'。看起來這是唯一的出路,然後我會向PhpStorm提交一個功能請求。 – 2014-11-03 21:41:27

+0

我想你可能是這方面的最高權威人士,但如果有人提出左場解決方案,我會把問題留待一天。 :) – 2014-11-03 21:42:05

+2

我唯一的左場理念是你寫一個版本的聲明(也許是全局的),然後自動生成一個包裝版本的文件作爲一個副本(只要用模塊JsHamcrest {並用一個'}'結尾)。儘管存在更優雅的方法,但您可以使用批處理文件來完成此操作。這給你一個地方來管理聲明。我正在做一個類似的技巧,使內部和外部模塊的代碼工作:https://www.stevefenton.co.uk/Content/Blog/Date/201411/Blog/Creating-A-TypeScript-Module-For-使用內部和外部模塊/ – Fenton 2014-11-04 13:37:41

相關問題