背景
Expressをインポートしたコードをtsc --noEmit
で型チェックしようとしたところ、
> pnpm tsc --noEmit index.ts
...can only be default-imported using the 'esModuleInterop' flag
のエラーが出たためtsconfig.json
に
"esModuleInterop": true
を追加したが、依然としてエラーが解消されなかった。
原因
When input files are specified on the command line, tsconfig.json files are ignored.
(コマンドラインで入力ファイルを指定するとtsconfig.jsonは無視されます。)
どうして・・・😢
解決策1(失敗)
ともかく原因は判明したので、tsconfig.json
を--project
オプションで明示的に指定してみます。
> pnpm tsc --noEmit --project tsconfig.json index.ts
error TS5042: Option 'project' cannot be mixed with source files on a command line.
Option 'project' cannot be mixed with source files on a command line.
(オプション「project」はソースファイルの指定と同時に使用できません)
無視するから指示してあげたのに、それすら許されない・・・😢?
解決策2(成功!だが嬉しくはない)
仕方がないのでコマンドラインで直接オプションを指定しました。
> pnpm tsc --noEmit --esModuleInterop index.ts
(エラーなし)
成功です(嬉しくはない)。
補足
lint-stagedとtscを併用する時に今回のエラーが発生する場合の解決方法はREADME.mdにありました👇
Example: Run tsc on changes to TypeScript files, but do not pass any filename arguments
まとめ
どうしてこんな面倒な仕様になっているんでしょうか・・・😢?
歴史的経緯などご存知の方がいればぜひコメントください・・・。