Closed4

bun test で型チェックが行われていない

sasumasasasumasa

X(Twitter)に投稿した内容をここにもメモしておく。
https://x.com/sasumasax/status/1718084652978844025

発端は Private Constructor を定義した ToDo クラスにて、テストファイルで new ToDo をわざと実行してみたら IDE はエラーを出すが bun test が普通に実行され、テストがパスしちゃうということがあった。

sasumasasasumasa

調べてみると、Bun は「Similar to other build tools, Bun does not typecheck the files」とのこと。
基本的には .ts ファイルをそのまま実行できるが、そのファイル内で import とかが行われていたらそのファイルを一旦 JS にトランスパイルするらしい。
https://bun.sh/docs/runtime/typescript

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.

sasumasasasumasa

つまり、冒頭のテストファイルでは ToDo クラスを import した時点で型チェックなしで JS にトランスパイルされて普通に実行されちゃったんだと思う。

じゃあどうするか、は ↑ の Note に書いてあるとおり tsc を使う

"scripts": {
  "typecheck": "tsc --noEmit",
  "test": "bun typecheck && bun test",
  "build": "bun typecheck && bun build ./index.ts --outdir ./build"
sasumasasasumasa

ちなみに「Similar to other build tools, Bun does not typecheck the files」の例でいうと Vite もこう書いてある
https://vitejs.dev/guide/features.html#typescript

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 などの他の静的分析チェックにも当てはまります。

このスクラップは2023/10/28にクローズされました