2016-03-15 55 views
0

我正在將現有的JavaScript應用程序轉換爲Typescript。我開始:爲名稱空間上暴露的方法創建類型定義

// file1.js 
(function(ns) { 
    ns.bar = function() { }; 
}(window.MyNamespace || {})); 
// file2.js 
(function(ns) { 
    ns.Item = function() { 
    this.doStuff = function() { ns.bar(); }; 
    } 
}(window.MyNamespace || {})); 

現在我將file2.js以打字稿:

module MyNamespace { 
    class Item { 
    doStuff() { 
     MyNamespace.bar(); // This is obviously a problem 
    } 
    } 
} 

沒有與調用bar問題。我知道將file1.js轉換爲TypeScript會使事情變得更容易,但實際上這個文件非常大,所以我想在下一次衝刺時進行轉換並獲得中間狀態。

我該如何解決這個問題?如何告訴tsc bar是模塊本身的功能

我在module及其變體中嘗試過declare var bar:() => void;,但是到目前爲止它還沒有起作用。

我知道我可以考慮將那些「命名空間功能的」靜態方法的類,但這需要重寫file1.js現在,我不想(還)。

我有一個解決辦法這樣的:

module MyNamespace { 
    var ns: any = MyNamespace; 

    class Item { 
    doStuff() { 
     ns.bar(); 
    } 
    } 
} 

但是,這感覺有點過,至少不是因爲它需要改變class,而我更願意有一個file2.tsfile1.ts之間的橋樑與最終file2.ts東西分開。

從本質上說,我覺得我正在寫一個.d.ts文件我原來file1.js功能,這將使file2.ts工作現在,在某種程度上可以保持轉換file1.js.ts後保持不變。

任何提示?如何爲我未轉換的file1.js創建打字?

回答

1

添加聲明語句下一個到模塊是這樣的:

declare module MyNamespace { 
    var bar:() => void; 
} 

module MyNamespace { 
    class Item { 
    doStuff() { 
     MyNamespace.bar(); // This will compile! 
    } 
    } 
} 

你可以(應該)刪除bar方法的這個臨時聲明,一旦你轉換file1.js以打字稿

相關問題