⛓️

TypeScriptで@types/mime v4を参照するとビルドが壊れた(解消されました)

2024/04/02に公開

追記 : 本件は解消されました。詳細は一番下に。

あなたのプロジェクトが@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という経路があり、そこに依存しているライブラリはそれなりにありそうです。

私の手元で観測している範囲だと

あたりが影響を受けそうです。

インストール時に

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月らしく、このタイミングでの変更はわりと唐突な印象も受けますね。

https://github.com/DefinitelyTyped/DefinitelyTyped/pull/69213

@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にコメントが付きました。

https://github.com/DefinitelyTyped/DefinitelyTyped/pull/69231#issuecomment-2030945165

serve-staticsendを通してmimeを参照しているので、@types/sendと同じように依存するのが妥当だろう、という見方ですね。なるほど。

package.jsonresolutions

  "resolutions": {
    "@types/mime": "^1"
  }

と書いてv1を参照するようにしてtscを実行したところ無事にトランスパイルできました。(当初lockファイルを変更していましたがフィードバックをもらって更新しました)

解決に向けた動きはとられているので遠からず問題は解消されそうに思いますが、今、目の前で問題が起きている場合はこうしたworkaroundがひとつの解決策になるかもしれません。

追記 : 解決しました

先のPRがmergeされました。

https://github.com/DefinitelyTyped/DefinitelyTyped/pull/69231

@types/serve-staticは直接的には@types/mimeではなく@types/sendを参照するように変更され、依存関係が

@types/express > @types/express-serve-static-core > @types/send > @types/mime@^1

に統一されました。@types/sendからの依存はバージョンも明示されているため、本件はこれで解消されました。

Discussion