TypeScriptで@types/mime v4を参照するとビルドが壊れた(解消されました)
追記 : 本件は解消されました。詳細は一番下に。
あなたのプロジェクトが@types/mime
に依存している場合、今lockファイルを作り直したりするとtscがこんなエラーを吐いてビルドできなくなるかもしれません。
error TS2688: Cannot find type definition file for 'mime'.
The file is in the program because:
Entry point for implicit type library 'mime'
@types/mime
を直接的に使うことは少ないかもしれませんが、@types/express > @types/serve-static > @types/mime
という経路があり、そこに依存しているライブラリはそれなりにありそうです。
私の手元で観測している範囲だと
- firebase-admin https://github.com/firebase/firebase-admin-node
- @slack/bolt https://github.com/slackapi/bolt-js
- @sentry/serverless https://github.com/getsentry/sentry-javascript/tree/v7/packages/serverless
あたりが影響を受けそうです。
インストール時に
warning @sentry/serverless > @types/express > @types/serve-static > @types/mime@4.0.0: This is a stub types definition. mime provides its own type definitions, so you do not need this installed.
みたいなメッセージが出る場合は問題が起きる可能性が高いと思われます。
何が起きているのか
2024/03/31に@types/mime
https://www.npmjs.com/package/@types/mime が更新されて「型情報はmime本体が提供してるからもうこのパッケージは不要やぞ」になりました。
本体がv4になったのは去年の11月らしく、このタイミングでの変更はわりと唐突な印象も受けますね。
@types/serve-static
は@types/mime@*
を参照しており、わりとざっくりした指定なので依存関係が不安定になりやすいです。
で、この時に@types/mime@4.0.0
を参照する構成になってしまうとビルドで不具合が起きます。
そもそもserve-static
本体はmime
に直接は依存しておらず最終更新も2年前なので、こいつが数ヶ月前にリリースされたv4を参照するのが妥当かは疑問が残ります。
もうひとつの@types/mime
@types/express
からの依存で入る@types/mime
には@types/serve-static
経由のものと、もうひとつ別の経路があります。
@types/express > @types/express-serve-static-core > @types/send > @types/mime@^1
という依存関係もあり、これに従って@types/mime@^1
もインストールされます。
依存関係にあるとはいっても別ライブラリなので、違うバージョンを参照すること自体はおかしなことではありませんが、2017年のv1と数ヶ月前のv4の両方に依存するのが本当に妥当なのかというと気になるところです。
全部v1に依存すればいい?
と、ここまで書いてる間に@types/serve-static
のPRにコメントが付きました。
serve-static
はsend
を通してmime
を参照しているので、@types/send
と同じように依存するのが妥当だろう、という見方ですね。なるほど。
package.json
のresolutions
で
"resolutions": {
"@types/mime": "^1"
}
と書いてv1を参照するようにしてtscを実行したところ無事にトランスパイルできました。(当初lockファイルを変更していましたがフィードバックをもらって更新しました)
解決に向けた動きはとられているので遠からず問題は解消されそうに思いますが、今、目の前で問題が起きている場合はこうしたworkaroundがひとつの解決策になるかもしれません。
追記 : 解決しました
先のPRがmergeされました。
@types/serve-static
は直接的には@types/mime
ではなく@types/send
を参照するように変更され、依存関係が
@types/express > @types/express-serve-static-core > @types/send > @types/mime@^1
に統一されました。@types/send
からの依存はバージョンも明示されているため、本件はこれで解消されました。
Discussion