2017-02-05 17 views
1

"target": "es5"でコンパイルされたTypeScriptプロジェクトがあります。私はcore-jsのSetを使用しているので、私のプロジェクトにはcore-jsと@ types/core-jsがインストールされています。 しかし、core-js d.tsにはグローバルな宣言SetMap(および他のES6の機能)が含まれているので、TypeScriptコンパイラを使用することができます。これは古いブラウザではうまく動作しません。core-jsおよびターゲットES5のTypescriptでサポートされていないES6機能を使用できます

明らかにインターフェイス用に必要なので、core.d.tsをビルドから除外することはできません。

コンパイラが私にES6機能を使用させずにコアjとそれに対応する型定義を使用しないようにする方法はありますか?

+0

? es6機能を使用したくない場合は、それらの機能に対応するタイプは必要ありません。 –

+0

私は 'Set'を使いたいです。しかし、私はcore-jsをグローバルな置き換えとして使うのではなく、むしろライブラリとして使うことを望んでいます。ですから、core-js/library/fn/setからcoreSetとして 'import * 'を必要とするファイルに';ですから、私は '新しいCoreSet ()'を実行できます。しかし、問題は私も 'new Set ()'を実行することができ、完全にコンパイルしてブラウザで失敗することです。 – Dina

+0

私は参照してください。 core-jsはpolyfillなので、宣言はグローバルスコープを変更するように設計されています。 set interfacesの宣言を見つけたり作成したりすることをお勧めします。かなりシンプルで、@ types/core-jsパッケージを削除して名前空間に混乱を招くことがあります。 –

答えて

0

core-jsはポリフィルであるため、その宣言はグローバルスコープを変更するように設計されています。あなたが設定したインターフェイスの独自の宣言を見つけたり作成したりすることをお勧めします。これはかなり簡単です。 @ types/core-jsパッケージを確実に削除してください。あなたが使用することができ

宣言は、あなたのローダーまたはノードのことで解決として、これは実際のJavaScriptファイルのインポートパスと名前が一致する周囲の外部モジュールの宣言であることを

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

ノートのようになります。機能が必要です。

周囲の外部モジュール宣言は、周囲の外部モジュールのグローバル名前空間に貢献するため、可能な限り避けるべきですが、この場合は回避することは困難です。

回避するには、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()を設定しました:を定義しました。 \t \t新しい(値:ArrayLike |セット):セット; ...' しかし、私は新しいセット(someOtherSet)を呼び出そうとすると、"期待される0のパラメータが1で呼び出されます "というメッセージが表示されます – Dina

+0

コンストラクタキーワードを使ってコンストラクタを宣言し、型引数をクラス自体に置きますアプローチは、TypeScriptのインストールディレクトリで 'lib.es2015.d.ts'を参照してください。SetとSetConstructorの宣言が含まれています –

関連する問題