TypeScriptのTS2742エラーと戦う
'<identifier>'の推論された型には、'<package>'への参照なしで名前を付けることはできません。これは、移植性が無い可能性があります。型の注釈が必要です。
よく分からないTypeScriptエラーの一つ。pnpmを使っているとたまによく見る。
TSKaigi 2025のLTでも発表したのでそちらもどうぞ
https://speakerdeck.com/teamlab/teamlab-tskaigitokyo2025
原因
https://github.com/microsoft/TypeScript/pull/58176#issuecomment-2052698294
型推論によって決まった型が間接的に依存しているパッケージに暗黙的に依存している
packageAがpackegeBに依存していて、pacakgeBがpackageCに依存しているとする
AからBのモジュールをimportしたとき、Bのモジュール内で使われる型がCに依存していて、Bから明示的に参照されていない(=型推論に依っている)場合、AからはCの型を解決することができない
node_modulesのどれがBから暗黙的に参照されているファイルなのかが分からないため
ややこしいな!elecdeer.icon
つまり、型推論では無く明示的に型を指定しようとしたときに、そのまでは型をimportできない場合にこのエラーがでる?
対応
同じパッケージの複数のバージョンがnode_modulesに含まれていないかを確認する
pnpmの場合はpnpm why <package>
同じパッケージでも、直接参照しているバージョンと依存パッケージが参照しているバージョンが異なると、型定義が異なる場合があり、それがこのエラーを発生させる要因の1つ
pnpm dedupeで解決する場合としない場合がある
package.jsonで指定されているバージョン範囲に矛盾しない形でバージョンを揃えられる場合は、これで解決するはず
揃えられない場合(辛い)
なぜかSemantic Versioningを全く信じずに特定の1バージョンで固定されていることがある
Storybook、お前のことだぞ!! elecdeer.icon
強制的に書き換えても問題無いと思われる場合は、パッケージマネージャのoverrides機能を使って置き換える
楽観的には、Semantic Versiononigに従っているならマイナーバージョンが変わる分には問題が無いはずだが...
<package>への参照を明示的に追加する
import type {} from "<package>"
本当にこれで解決することがある
<package>の型をTypeScriptが見たことがないのにその型を参照しようとしているのが原因なので、明示的な参照で解決する
中間にいるパッケージがコントロール下にある場合、型推論に頼らずに明示的に型を指定すると解決する
TypeScript5.5で追加された--isolatedDeclarationsオプションを使うと、これを強制できる
TypeScriptを5.5に上げる
https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-5.html#consulting-packagejson-dependencies-for-declaration-file-generation
解決するときもあれば、しないときもある
#2024Sep