bun test で型チェックが行われていない
X(Twitter)に投稿した内容をここにもメモしておく。
発端は Private Constructor を定義した ToDo
クラスにて、テストファイルで new ToDo
をわざと実行してみたら IDE はエラーを出すが bun test
が普通に実行され、テストがパスしちゃうということがあった。
調べてみると、Bun は「Similar to other build tools, Bun does not typecheck the files」とのこと。
基本的には .ts
ファイルをそのまま実行できるが、そのファイル内で import
とかが行われていたらそのファイルを一旦 JS にトランスパイルするらしい。
Bun can directly execute .ts and .tsx files just like vanilla JavaScript, with no extra configuration. If you import a .ts or .tsx file (or an npm module that exports these files), Bun internally transpiles it into JavaScript then executes the file.
Note — Similar to other build tools, Bun does not typecheck the files. Use tsc (the official TypeScript CLI) if you're looking to catch static type errors.
つまり、冒頭のテストファイルでは ToDo
クラスを import
した時点で型チェックなしで JS にトランスパイルされて普通に実行されちゃったんだと思う。
じゃあどうするか、は ↑ の Note に書いてあるとおり tsc
を使う
"scripts": {
"typecheck": "tsc --noEmit",
"test": "bun typecheck && bun test",
"build": "bun typecheck && bun build ./index.ts --outdir ./build"
ちなみに「Similar to other build tools, Bun does not typecheck the files」の例でいうと Vite もこう書いてある
Note that Vite only performs transpilation on .ts files and does NOT perform type checking. It assumes type checking is taken care of by your IDE and build process.
Vite の仕事は、ソース モジュールをブラウザ内でできるだけ高速に実行できる形式に変換することです。そのために、静的解析チェックを Vite の変換パイプラインから分離することをお勧めします。この原則は、ESLint などの他の静的分析チェックにも当てはまります。