TypeScript 2.7.2、VSTypeバージョン1.21、@ types/expressおよびそれに続くコードでここで発生する奇妙なことは、場合によってはVSCodeが「名前空間スタイルのインポートを呼び出したり構築したりできず、実行時の失敗。」。ただし、同様のセットアップと同様のtsconfig.jsonファイルを持つ他のマシンでは、コードは機能します。ここで何が起こっているのか:
import { Bank } from './Bank';
import * as Express from 'express'; <== errors here..
let app: Express.Express;
this.app = Express(); <== and here
なぜこうなった?
TIA、
ジョン。
エラーはesModuleInterop: true
でのみ発生します。おそらくVSCodeはtsconfig.json
を無視しているか、esModuleInterop: true
を持つ別のコードが使用されています。
決定的な修正を行うには、コンパイラオプションesModuleInterop
をtrue
に設定し、import express
の代わりにimport * as express
を使用します。
問題:
ES6仕様は、「名前空間オブジェクト」の概念を定義しています。名前空間オブジェクトは、このステートメントのnamespaceObject
です:import * as namespaceObject from 'a-module'
。 typeof
このオブジェクトはobject
です。これを呼び出すことはできません。
express
はCommonJSモジュールであるため、これまでimport * as express
を使用していました。Node.jsでは、module.exports
を使用してエクスポートされます。ただし、ES6仕様では違法であり、TypeScriptは警告を表示します。
解決策:
esModuleInterop
をtrueに設定すると、TypeScriptはimport
呼び出しをラップして、モジュールがES6モジュールまたはCommonJSかどうかを確認します。 CommonJSモジュールであり、import default from 'module'
を使用している場合、TypeScriptは正しいCommonJSモジュールを見つけて返します。
注:既存のコードベースへの不当な中断を避けるために、新しい動作がフラグの下に追加されます。新規および既存のプロジェクトの両方に適用することを強くお勧めします。既存のプロジェクトの場合、名前空間のインポート(「エクスプレス」からのエクスプレス*;エクスプレス();)をデフォルトのインポート(「エクスプレス」からのエクスプレスエクスプレス;エクスプレス();)に変換する必要があります。