【Deno1.23～】`deno run`コマンドは型チェックしなくなるので注意

2022年6月リリースのDeno1.23で、`deno run`コマンドの挙動の「実行」の部分と「型チェック」の部分が切り分けられ、別のコマンドになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678625/8abcdfbf-048e-fc40-624c-e24faa95544b.png)

更に、型チェックのデフォルトの挙動が「リモートファイルも含め型チェック」から「**ローカルファイルのみ型チェック**」に変わります。

これに合わせて関連するコマンドの挙動もいくつか変更されます。

なお、これらの変更はTypeScriptを使っている場合のみ影響します。JavaScriptの実行には関係ありません。

## 変更後の`deno run`コマンドの挙動と、各オプションについて

具体的に各コマンドの挙動がどのように変更されるかというと、

【従来】

- デフォルト→リモートファイルとローカルファイルを型チェック
- `--no-check=remote`フラグ付き→ローカルファイルのみ型チェック
- `--no-check`フラグ付き→型チェックしない

だったものが、

【変更後】

- `--check=all`フラグ付き→リモートファイルとローカルファイルを型チェック
- `--check`フラグ付き→ローカルファイルのみ型チェック
- デフォルト→型チェックしない

に変更されます。

この変更は、

- `deno run`コマンド
- `deno cache`コマンド
- `deno eval`コマンド
- `deno repl`コマンド

に影響します。

他のコマンド（`deno test`など）については、「ローカルファイルのみ型チェック」がデフォルトの挙動になります。

> https://deno.com/blog/v1.22#default-type-checking-behavior-has-been-updated
> <div>
Subcommand | v1.21 | v1.22 | v1.23 (予定)
----|----|----|----
`deno bench` | 🌐 Full | 📁 Local | 📁 Local
`deno bundle` | 🌐 Full | 📁 Local | 📁 Local
`deno cache` | 🌐 Full | 📁 Local | ❌ None
`deno check` | 📁 Local | 📁 Local | 📁 Local
`deno compile` | 🌐 Full | 📁 Local | 📁 Local
`deno eval` | ❌ None | ❌ None | ❌ None
`deno repl` | ❌ None | ❌ None | ❌ None
`deno run` | 🌐 Full | 📁 Local | ❌ None
`deno test` | 🌐 Full | 📁 Local | 📁 Local
</div>

- 🌐 Full：リモートファイルも含め型チェック
- 📁 Local：ローカルファイルのみ型チェック
- ❌ None：型チェックなし
</blockquote>



これらの変更はDeno1.23（2022年6月リリース）で導入されます。それまでの間、変更後の挙動を試すには、環境変数`DENO_FUTURE_CHECK=1`を設定します。

## なぜこの変更が行われるのか

#### 型チェックが`deno run`から分離される点

この提案は遡ること1年半前の[discussion](https://github.com/denoland/deno/discussions/8549)と[issue](https://github.com/denoland/deno/issues/11340)で議論されていました。

変更に至った経緯は[公式ブログ](https://deno.com/blog/v1.21#deno-check-and-the-path-to-not-type-checking-by-default)に書かれています。

- Denoはlanguage server（エディタに補完や診断を出すやつ）の組み込みサポートがあるため、それを使って型チェックすることができる
- [proposal-type-annotations](https://github.com/tc39/proposal-type-annotations)にてJavaScriptに静的型付け構文を導入中。このproposalが導入されると、実行時に型チェックしないのが"標準"の挙動になる。DenoはWeb標準の挙動に合わせていくため、実行時に型チェックしない

という理由から、`deno run`コマンドで実行するときに型チェックが行われなくなります。
公式ブログによると、デフォルトで型チェックしなくなるとはいえ、TypeScriptのファーストクラスサポートは続けていくということです。


#### デフォルトではリモートファイルを型チェックしなくなる点

従来は外部ライブラリの型エラーについても表示されていました。しかしこれでは、

- 外部ライブラリの型チェックが通らない場合（lib.dom.d.tsが必要な場合など）
- 自分のコードと外部ライブラリの間で使っているtsconfigが違う場合

に型エラーが出てしまいます。
（Deno本体で実行時に使われるデフォルトのtsconfigがアップデートされた場合も、依存している外部ライブラリが全てアップデートされ型エラーが解消されるまで型チェックを無効にしなければいけません。）

こうした事態を防ぐため、型チェックする場合でも、ローカルファイルのみ型チェックするのがデフォルトに変更されました。

## ユーザーへの影響

今まで`deno run`コマンドで実行していた場合、人によってはコマンドラインフラグの追加指定が必要になります。

#### vscodeなどのIDE機能を使っている方

IDEの拡張機能をインストールしていれば、開発時にエディタ上で型チェックが走っています。
エディタ上の型チェックで十分だから実行時に型チェックする必要はないという方は、そのまま`deno run <file>`を使い続けて大丈夫です。

#### vscodeなどのIDE機能を使っていない方

IDEなど、エディタで型チェックできる機能を使っていない方は、手動で型チェックする必要があります。
単に型チェックのみ行いたい場合は`deno check <file>`コマンドを、
実行時に型チェックする場合は`deno run --check <file>`コマンドを使いましょう。

#### CI設定等

従来は`deno test --no-run`や`deno cache`コマンドを使って型チェックする方法が知られていました。

- 現在`deno test --no-run`を使って型チェックしている方
→直ちに変更する必要はありませんが、型チェックするための`deno check`コマンドができたので将来的に切り替えを検討しましょう。
- 現在`deno cache`コマンドを使っている方
→`deno cache`コマンドはデフォルトでは型チェックしなくなります。`deno check`コマンドに切り替えましょう。
- 現在CIで型チェックしていない方
→実行時に型チェックしなくなるため、CIで`deno check`を実行し型チェックするようにしましょう。

というわけで、この機会にCI設定を見直してみましょう。

## まとめ

- `deno run`コマンドの挙動が変更され、型チェックしなくなる
  - 今後、実行時に型チェックするには`deno run --check`
  - 型チェックは`deno check`コマンド
- これらの変更はDeno1.23で導入される。

## 感想

そもそも静的型付けのポイントは、実行する**前**にエラーを早期発見できることです。
実行時に型チェックするのではなく、それより前の段階（エディタ上やCIなど）で型チェックを行いエラーを検出するのが、正しい型チェックの使い方だと思います。
ということで近年のフレームワークやビルドツールは型チェックしないのが主流になっているように感じます（Next.jsやGatsby、esbuildなど）。