1. ホーム
  2. javascript

[解決済み] esModuleInterop が true の場合、明示的に allowSyntheticDefaultImports を使用して TypeScript transpilation を構成する必要がありますか?

2022-01-26 07:03:03

質問

以下の説について確認が必要です。によると TSドキュメント で設定できるオプションは2つあります。 tsconfig.json .

  1. --allowSyntheticDefaultImports を指定します。 デフォルトエクスポートがないモジュールからのデフォルトインポートを許可します。これはコード生成には影響せず、型チェックにのみ影響します。

  2. --esModuleInterop: 実行時のバベルエコシステムの互換性のために __importStar と __importDefault ヘルパーを発行し、タイプシステムの互換性のために --allowSyntheticDefaultImports を有効にします。

ググってみると、両方が設定されているようです。 (少なくとも私が目指している動作に関しては)。しかし、私がドキュメント、TS、JSへのトランスピレーションを理解する限り、それらを両方使用することは意味がありません。

私の考えだと、後者だけを使い、前者を完全に削除するかもしれません。しかし、慎重で謙虚な私は、完全に確信があるわけではなく、今のところ気づかないうちに明るくないことをやっているのではないかと心配しているのです。

このような不謹慎なことをすると、後々ロバに噛み付かれ、何時間も嘆きながら必死にトラブルシューティングをすることになりそうで怖いです。懐疑的な根拠は、両方の選択肢があることなので、4つのケースで全ての組み合わせ( 真/偽 など)が必要なのですが、どれがそうなのか想像がつきません。

を飛ばしても全く問題ないでしょうか? --allowSyntheticDefaultImports もし --esModuleInterop: true コンパイラーオプション ? また、その場合、なぜそのようなオプションがあるのでしょうか?

おまけの質問:4つの組み合わせすべてで必要になるのはどんなときか( 真/偽 という2つの選択肢について教えてください。

どのように解決するのですか?

もし、あなたが、このまま allowSyntheticDefaultImports を未定義にし esModuleInterop の場合、答えはYESになるはずですが、これには問題がありました。 PR #26866 は修正されたようですが、9月17日にマージされただけなので、短期的にはリスクがあるかもしれません。

なぜ両方が存在するかというと、これらは両方とも Babel-transpiled モジュールのインポートに関する互換性の問題に対処するための一部だと思います。最初の PR では特定のコンパイル時のメッセージに allowSyntheticDefaultImports オプションを追加しましたが、実際にはインポートの実行時の動作に対処していませんでした。 そこで、後から --esModuleInterop が追加されました。 参照 TypeScript-ハンドブック/#816 docsの更新方法については...