'@/styles/globals.css' の副作用インポートに対するモジュールまたは型宣言が見つかりません。ts(2882)
ある日、Next.jsのlayout.tsxなどでcssやscssをimportしている箇所が、VSCodeのエディタ上でエラー表示されるようになりました。

なんとなく最近TypeScriptの6がリリースされたからかなと思っていたので、Google検索したところ、型定義を追加しろとのことだったので、
src/types/styles.d.tsというファイルを作成し、以下のように記述したところ、エラーが解消しました。
declare module "*.css";
declare module "*.scss";
もともとtsconfig.jsonには以下のように書いていたので、他の変更が必要ありませんでした。
"typeRoots": ["src/types", "./node_modules/@types", "../../node_modules/@types"],
珍しくGoogle検索のAIモードの答えがそのままだったなと思ったりしたのですが、
後日、型定義を宣言していないにもかかわらずエラーにならないプロジェクトがあることに気が付きました。
なぜ、プロジェクトによってts(2882)が発生するのか?
開発しているプロジェクトの構成は、どれもYarn Workspaceを利用したモノレポ構成であるにも関わらず、
ものによってはエラーが発生しないことが気になったので検証してみたところ、
以下のIssueで言及されているようにVSCodeとpackage.jsonのバージョンが異なることが関連していました。
github.com
つまりVSCodeでCSSのimportがts(2882)になっていたのは、
package.jsonで利用しているTypeScriptが5系で、VSCodeのTypeScriptのバージョンが6系なことが原因だったようです。
なぜエラーにならないプロジェクトがあったのか?
それはワークスペース内のTypeScriptのバージョンが、VSCodeのTypeScriptのバージョンと全て同じ6系だったためでした。
例えば、VSCodeのTypeScriptのバージョンが6.0.3で、プロジェクト内のpackage.jsonに存在するtypescriptが6.0.3や6.0.2の場合は、
ts(2882)のエラーが発生しません。
しかし、プロジェクト内のpackage.jsonに5系のtypescriptが存在していた場合、
CSSをimportしているアプリケーションのpakcage.jsonで、typescriptが6系になっていてもエラーが発生します。
・・・どういうことやねん!!!
そもそも実際のビルドではエラーになりませんし、VSCode依存の話のようなので、あまり気にしないのがよさそうです。
問題解消するまでの経緯
そもそもts(2882)が発生する根本原因はなんだろうと、GoogleのAIによる概要を無視して調べたところ、
上記のIssueに行き着き、VSCodeのTypeScriptバージョンが切り替えれることを知りました。
それならなにかTS関連の設定が影響しているのかとtsconfig.jsonの内容を確認してみたり、node_modules内の型定義を調べてみたりしたのですがなにもわからず、
5系を6系に上げてみてもエラーは発生するので「もういいか、諦めて」と何度も思ったのですが、絶対になにか原因があるのは明らかだったので、ソシャゲをしながらも考えていました。
というか実は「もしかしてこれかも?」と思い当りながらも、「まさかそんなことないかw」と思って確認していなかったのが、
ワークスペース内のTypeScriptのバージョンが、VSCodeのTypeScriptのバージョンと全て同じ6系であること
でした。
そう疑っていながらも「アプリケーションが参照しているpackage.jsonのtypescriptを6.0.3にしたのだから、他のpackage.jsonが5系でも関係ないはず」と確認するのを面倒くさがり、勝手な結論を導き出したため、結果として無駄に時間を消費してしまったわけです。
「まあ最後に検証してみるか」と確認したので、原因が判明しましたが、なんとも言えない気持ちでこの記事を書いています。
というのも、仕事でも似たようなことは何度かあり、その都度「まさかこんなことが」というのが原因でしたし、1つは苦い思い出として記憶に残っているため、成長が感じられないというか、なんというか・・・まあ確認しただけ成長したか、とかそういう気持ちです。
ちなみに苦い思い出は、ApacheとBIG-IPの組み合わせが正常に動作しないパターンがあったのですが、それの調査がまさに今回と同じように「このパターンはこれが問題なかったから問題ないはず」としてスルーしてしまったのが、最後は先輩と全パターン網羅チェックしていたらまさにそのスルーしたパターンだったというやつでした。はぁ・・・
今後の検証は面倒くさがらないように頑張ってほしい、自分。
補足情報
- VSCodeバージョン: 1.119.0 (Universal)
参考