最近React Nativeでアプリを開発していて、バックエンドをBunで作ろうとしたら型の競合が起きてしまいややはまったのでメモ。
エラー文としては以下のようなエラーになる。
Class 'File' incorrectly implements interface 'Blob'. Type 'File' is missing the following properties from type 'Blob'
原因は以下の2つが重なること:
- @types/bun が Blob を拡張している
- expo-file-system が .d.ts ではなく生の .ts ファイルで配布している
.d.ts には skipLibCheck: true が効くが、生の .ts ファイルは通常のソースコードとして型チェックされるため回避できない。特にmonorepoで node_modules を共有している構成だと踏みやすい。
回避策としては expo-file-system/next の代わりに expo-file-system/legacy を使うことで対応できる。
根本解決には expo 側が .d.ts で配布する必要があり、それは認識されているようだが大規模リファクタが必要で短期的には解決されそうにないらしい。
詳細: https://github.com/expo/expo/issues/42167
React Native + Bun の組み合わせはさらに何か問題にあたる可能性があるのかもしれない。
余談ではあるがこういう人間が検索すると割とすぐに情報にたどり着ける場合であってもAIはまだ結構迷子になってしまうことがあるのでちゃんとバランスを取っていかないとなと感じた。