はじめに
皆さんこんにちは。エンジニアの細川です。
皆さんはNestJSで開発を行っているときにError: Nest can't resolve dependencies of the AppController
のようなエラーに遭遇したことはありませんか?
基本的にこのエラーは依存性の解決がうまくできないときに発生するので、各モジュールの依存(imports
やexports
)を確認すれば解決できることが多いです。
しかし、コードをいくら確認しても問題ないのに、この依存性解決が出るという場面に出くわしたので共有します。同じ原因でエラーが出ている方の参考になれば幸いです。
原因
早速原因ですが、ずばりimportが以下のように型importになっていたことでした。
// 正しい状態
import { AppService } from "@modules/app/services/app.service";
// エラーが出る状態
import type { AppService } from "@modules/app/services/app.service";
この状態ではNestJSがうまく依存性を解決できず、エラーとなってしまいます。
特にBiomeを導入している方は、デフォルトでこのルールが有効になっており、formatされるタイミングで勝手に型インポートに変換されるので、注意が必要です。
Biomeの公式ドキュメントでもルールを無効にすることを推奨されています。
エラーから原因が分かりづらいので皆さんも注意してください。
対処法(Biomeの場合)
対処法としてはこのルールをオフにすることです。
biome.json
に以下の記述を追加します。
{
...
"linter": {
...
"rules": {
// 以下を追加
"style": {
"useImportType": "off"
}
}
}
}
これを追加しておくことで、format時に自動で型importに変更されることもなく依存性解決エラーを解消できます。
ESLintの場合
ESLintの場合もconsistent-type-imports
というルールが存在するようなので、もしpluginなどに含まれていて明示的にオフにする必要がある場合は無効にしておくと良いかと思います。
詳細はESLintの公式ドキュメントを確認してみてください。
おわりに
今回はNestJSで謎の依存性解決エラーが出る場合の対処法を紹介しました。
エラーから原因を探りづらいので、こちらの記事が参考になれば幸いです。
他にもNestJSやTypeScriptの記事を書いているのでぜひ読んでみてください。
今回参考にさせていただいた記事
https://biomejs.dev/ja/linter/rules/use-import-type/
https://typescript-eslint.io/rules/consistent-type-imports/
https://zenn.dev/dev_commune/articles/ba2586c6ad3efc