2017-02-05 21 views
1

我有一個TypeScript項目編譯"target": "es5"。我使用core-js的Set,所以我在我的項目中安裝了core-js和@ types/core-js。 但是,由於core-js d.ts包含全局聲明SetMap(以及其他ES6功能),因此TypeScript編譯器允許我使用它們,這在舊的瀏覽器中顯然不起作用。core-js和Typescript與目標ES5允許使用不受支持的ES6功能

我不能排除core.d.ts從構建,因爲我明顯需要它的接口。

編譯器有沒有辦法阻止我使用ES6功能並仍然使用core-j及其相應的類型定義?

+0

你從它需要什麼樣的接口?如果你不想使用es6功能,那麼你不應該需要與這些功能相對應的類型。 –

+0

我想使用'Set'。但我不想用core-js作爲全球替代品,而是作爲一個圖書館。因此,我從'core-js/library/fn/set';''中導入*作爲CoreSet作爲需要它的文件。所以我可以做'新的CoreSet ()'。但問題是,我也可以執行'Set Set ()',它編譯完美,然後在瀏覽器中失敗。 – Dina

+0

我明白了。由於core-js是一個polyfill,它的聲明旨在修改全局範圍。我建議你找到或創建你自己的設置接口的聲明,這是相當簡單的,並且絕對刪除@ types/core-js包,因爲它會對你的命名空間造成嚴重破壞 –

回答

0

由於core-js是一個polyfill,它的聲明旨在修改全局範圍。我建議你找到或創建你自己的設置界面的聲明,這很簡單。 絕對刪除@ types/core-js包。

,你可以使用看起來像

declare module "core-js/library/fn/set" { 
    class Set { ... } 
    export = Set; 
} 

注意,這是一個名稱的環境外部模塊聲明實際JavaScript文件的導入路徑通過您的裝載機或節點爲解決相匹配的聲明需要功能。

環境外部模塊聲明應儘可能地避免,因爲它們都對環境外部模塊的全局命名空間有貢獻,但在這種情況下很難避免。

您可以避免的一種方法是使用tsconfig.json中的路徑配置。

路徑對非環境-declaration.ts

class Set { ... } 
export = Set; 

tsconfig.json

{ 
    "compilerOptions": { 
    "baseUrl": "", 
    "paths": { 
     "core-js/library/fn/set": [ 
     "path-to-non-ambient-declaration" 
     ] 
     } 
    } 
    } 
} 
+0

感謝您的詳細解答!雖然我在構造函數上遇到了麻煩。我定義了'class Set { \t \t new():Set ; \t \t new(values:ArrayLike | Set ):Set ; ...' 但是,當我嘗試調用新的集合(someOtherSet)時,出現錯誤,提示「期望0參數但用1調用」 – Dina

+0

使用構造函數關鍵字聲明構造函數,並將類型參數放在類本身或替代使用一對接口的方法參見TypeScript安裝目錄中的'lib.es2015.d.ts',它包含一個聲明Set和SetConstructor –

相關問題