tsconfigのmoduleResolutionについて
状況
型定義ファイルはあるのに、ESLintがそれを認識できずにunSafe系のエラーが出た。ESLlintのFlat configファイルのコードにて発生。tsconfigの設定に問題ありと仮定して進める。
解決
moduleResolution
を有効にして、bundler
にしたらエラーが消えた。さらに以下のissueを見つけて
Node16にしてもエラーが出なかった。
なぜそうしたか?
たまたまReact
Vite
環境のtsconfigファイルを見た時にmoduleResolution: bundler
だったので同じようにしてみた。
moduleResolutionによくわかってないので調べていく。
TypeScriptの公式ドキュメントのtsconfigの章
moduleResolutionはモジュール解決の方法を指定するもの。
'node16' or 'nodenext' for modern versions of Node.js. Node.js v12 and later supports both ECMAScript imports and CommonJS require, which resolve using different algorithms. These moduleResolution values, when combined with the corresponding module values, picks the right algorithm for each resolution based on whether Node.js will see an import or require in the output JavaScript code.
'node16'または'nodenext'を使用してください。 Node.js v12 以降は ECMAScript import と CommonJS require の両方をサポートしており、これらは異なるアルゴリズムで解決します。 これらの moduleResolution 値は、対応するモジュールの値と組み合わせると、Node.js が出力される JavaScript コードで import を見るか require を見るかに基づいて、それぞれの解決に適したアルゴリズムを選びます。
'node10' (previously called 'node') for Node.js versions older than v10, which only support CommonJS require. You probably won’t need to use node10 in modern code.
node10」(以前は「node」と呼ばれていた)は、v10より古いバージョンのNode.js用で、CommonJS requireのみをサポートしている。 最近のコードでは、おそらくnode10を使う必要はないでしょう。
'bundler' for use with bundlers. Like node16 and nodenext, this mode supports package.json "imports" and "exports", but unlike the Node.js resolution modes, bundler never requires file extensions on relative paths in imports.
'bundler'はバンドルで使用します。 node16 や nodenext のように、このモードは package.json の "imports" と "exports" をサポートしますが、Node.js の解決モードとは異なり、bundler は imports の相対パスにファイル拡張子を要求しません。
'classic' was used in TypeScript before the release of 1.6. classic should not be used.
classic」は1.6リリース以前のTypeScriptでは使われていた。
これらから考えると、現在使うべきなのはnode16
nodenext
bundler
か。
※現在自分の開発環境では node v20.10.0
次に以下を読む