web-dev-qa-db-ja.com

Visual Studio 2017のTypeScript:自動定義を含めると重複識別子エラーが発生する

UPDATE:ハッキングなしで問題なく動作するようにする回避策があります。後世のために、以下で説明する以前の試みを残します。実用的なソリューションの答えをご覧ください。


プロジェクトをVisual Studio 2017にアップグレードしたばかりで、あらゆる種類のTypeScriptエラーが突然発生しています。それらの多くは_Duplicate identifier_エラーです。エラーの1つをダブルクリックすると、次のようなディレクトリにあるindex.d.tsというファイルが開きます。

_C:\Users\[me]\AppData\Local\Microsoft\TypeScript\node_modules\@types\jquery\index.d.ts
_

このページで読んだ内容に基づいて:

https://blogs.msdn.Microsoft.com/visualstudio/2016/11/28/more-productive-javascript-in-visual-studio-2017-rc/

...起こっているのは、Visual Studioが定義ファイルをすでに手動で含めているタイプの定義ファイルを便利にダウンロードしようとしているようです。定義ファイルの自動インクルードは素晴らしい機能のように聞こえます!手動で含めたものを削除するだけですよね?しかし、私が何もしないようです。誰かが私が間違っているところを教えてくれることを願っています。

背景として、Visual Studio 2015での作業の仕方は次のとおりです。私は、jQuery、jQuery UI、およびQUnitの3つのライブラリーを使用していました。 DefinitelyTypedから.d.tsファイルをダウンロードし、プロジェクトのScriptsディレクトリに配置するだけで、VS 2017でプロジェクトを開くまですべて正常に機能しました。

エラーメッセージから、Visual Studio 2017が独自の定義ファイルを読み込んでいるように見えるため、手動で読み込んだものを削除するだけだと考えました。しかし、それを行うと、_Cannot find name $_エラーが大量に発生します。これは、何らかの理由でこれらの定義ファイルが取り込まれなくなったことを意味しているようです。

次に、プロジェクトに実際にJQuery(およびその他のライブラリ)ソースファイルがなかったことが問題であると考えました。 HTMLソースでGoogleのCDNから参照しているだけです。上記のリンクは、Visual Studioが定義ファイルを取り込む必要があることを示すインジケータとして実際のルーズファイルを探しているように聞こえます。そのため、手動でScriptsディレクトリにファイルを追加して再構築しましたが、何も変わりませんでした。

上記のリンクページでは、npmまたはbowerのライブラリファイルを含めること、またはtsconfig.jsonファイルを使用することについても説明していますが、それらの道を進む前に(私の通常のワークフローの一部ではありません)、誰かが教えてくれることを願っていますVisual Studio 2017にTypeScript定義を取り込む好ましい方法はありますか?前もって感謝します。


UPDATE:(以下のアップデート2も参照)動作するようになりました。これは正確に直観的なものではなかったので、a)誰かを助け、b)間違ったやり方をしているだけだと誰かが教えてくれることを期待して、ここでステップを共有しています。

  1. すべてのTypeScriptコードと定義ファイルをプロジェクトから削除します。
  2. Packages.jsonを開き、そこにある定義ファイルの参照も削除します。
  3. きれいにしてビルドします。エラーや警告はありません。
  4. NuGetを使用して、必要な定義ファイルをインストールします(たとえば、jQueryの場合、必要なパッケージは「jquery.TypeScript.DefinitelyTyped」です)。
  5. これにより、定義ファイルがScripts\typings\jqueryにインストールされます。
  6. 参照する他のライブラリについても同じことを行います。
  7. 新しいテストTypeScriptファイルを追加し、ライブラリを使用しようとする行を追加します。たとえば、var foo = $(document);
  8. IntelliSenseが機能します!プロジェクトビルド!ビジネスに戻ったようです!
  9. そんなに早くない。数秒後、重複IDエラーが再び発生します。 Visual Studioが独自に定義ファイルを選択したようです(おそらく、NuGetを介して定義ファイルを含めることでアクティブ化された)が、再び競合が発生しました。
  10. 次のディレクティブを使用してtsconfig.jsファイルを追加します。これにより、Visual Studioが独自の定義ファイルのコピーをダウンロードできなくなります:_{ "compilerOptions": { "types": [] } }_
  11. エラーがなくなりました。
  12. そんなに早くない!数秒後、数百の新しいエラーが表示され、プロジェクトから完全に削除したTypeScriptファイルを参照しています。エラーウィンドウで参照されているファイルの1つを開くと、_<Project>\obj\Debug\..._でコピーが作成されたようです(パスは長くなりましたが、記録するのを忘れていました)
  13. ソリューションをクリーニングしても、これらのファイルは削除されません。
  14. objディレクトリ全体を手動で削除します。
  15. 元のTypeScriptファイルをすべてプロジェクトに追加し直します。
  16. 再構築します。成功!

UPDATE 2:上記のアプローチのいくつかの欠点を発見しました。また、より良い解決策があります。

Tsconfig.jsonの使用には大きな欠点があります。保存時に再コンパイルするオプションは、Visual Studio内では機能しません。サイトをデバッグモードで実行し、TypeScriptにいくつかの変更を加え、保存をクリックして、すぐにそれらの変更がサイトに反映されるのを確認します。

私にとってトラブルを引き起こしていたことの1つは、TypeScriptファイルがスクリプト以外のフォルダにあることだと思いますサーバーにそのまま展開する必要があります。 Microsoftはこれを非標準のユースケースと見なしていると思います。

これ以上長すぎると頭を壁にぶつけた後、私は簡単だが、ハッキーな解決策を見つけた。このディレクトリ内のすべてのサブディレクトリを取得しました。

_C:\Users\[me]\AppData\Local\Microsoft\TypeScript\node_modules\@types
_

それらを削除済みというディレクトリに移動しました。

バム。定義の自動インクルードやエラーはもうありません。

マイクロソフトは、あなたが読んでいるなら、私のシナリオのサポートを提供してください。

  • スクリプト以外のディレクトリに保存されているTypeScriptファイル
  • サードパーティCDNへの参照を介して含まれるライブラリ(jQueryなど)
  • NuGetを介して直接含まれる上記のライブラリの定義ファイル。

UPDATE 3:やっと機能しました。非ハッキングソリューションについては、以下の回答を参照してください。

26
Brian Rak

ハックなしで動作するようになりました。トリックはtsconfig.jsonファイルを使用し、自動定義インクルードを無効にすることです。私の最初の質問で、私はこれを試してみましたが、保存時にコンパイルを使用できないことがわかりました。ただし、それは「compileOnSave」オプションを実際に使用すべきだったときに「watch」オプションを使用しようとしていたためです。

元の壊れたプロジェクトを適切に動作するに変換し、変更されていないVisual Studio 2017のインストールで引き続き適切に動作するための完全な一連の作業手順を次に示します

ルートのプロジェクトにtsconfig.jsonファイルを追加します。

少なくとも以下を使用してファイルを構成します。

{ "compilerOptions": { "types": [] } }

ただし、おそらく他のオプションを使用することもできます。私のファイルは次のようになります。

{
  "compileOnSave": true,
  "compilerOptions": {
    "types": [],
    "sourceMap": true,
    "target": "es5",
    "noEmitOnError": true
  }
}

他のコンパイラオプションについては、こちらで学ぶことができます。 https://www.typescriptlang.org/docs/handbook/compiler-options.html

定義が自動的に含まれないようにするのは、"types":[]部分です。

つまり、使用するライブラリの定義を取り込むのはユーザー次第です。幸いなことに、NuGetを使用すると非常に簡単です。たとえば、jQueryの場合は、jquery.TypeScript.DefinitelyTypedを検索して適切なバージョンをインストールするだけです。これにより、Scripts/typingsの下にフォルダーが作成されます。

以前にエラーが発生した場合は、いくつかの問題を解決する必要があるかもしれません。プロジェクトをクリーンアップし、プロジェクトのディレクトリ構造の最上部にあるobjディレクトリを削除します。これで正しくビルドされるはずです。ファイルに何かを入力して再び保存すると、いくつかのエラーが発生しました。 Visual Studioの再起動も適切な場合があります。

がんばろう!


UPDATE:Azureに発行すると、再びエラーが発生することがわかりました。ただし、Perfaによって提案されたディレクティブをtsconfig.jsonファイルに追加し、binおよびobjディレクトリを削除してVisual Studioを再起動すると、これらのエラーはありませんどちらかが長く現れた。これで、Azureを何度もビルドして再ビルドし、公開しましたが、本当にうまくいっているようです。

明確にするため、完全なtsconfig.jsonファイルは次のようになります。

{
  "compileOnSave": true,
  "compilerOptions": {
    "types": [],
    "sourceMap": true,
    "target": "es5",
    "noEmitOnError": true
  },
  "exclude": [
    "node_modules",
    "obj",
    "bin"
  ]
}
17
Brian Rak

vS 2017をインストールした後、このエラーが発生しました。それを取り除くために、tsconfig.json excludeセクションをobjとbinで更新しました。

"exclude": [
    "node_modules",
    "obj",
    "bin"
  ]
6
Perfa

私はVS 2017に更新した古いアプリでこの正確な問題を抱えていましたが、harley.333の答え-TypeScript 2.0 SDKを含めるようにインストールを変更することで修正しました。

コメントする担当者はいませんが、それを見つけるには、タブを「個別コンポーネント」に切り替える必要があります。次に、最後のグループ「SDK、ライブラリ、およびフレームワーク」に移動します。

TypeScript SDKスクリーンショットのインストール

1
Will Swope