2022年6月リリースのDeno1.23で、deno run
コマンドの挙動の「実行」の部分と「型チェック」の部分が切り分けられ、別のコマンドになります。
更に、型チェックのデフォルトの挙動が「リモートファイルも含め型チェック」から「ローカルファイルのみ型チェック」に変わります。
これに合わせて関連するコマンドの挙動もいくつか変更されます。
なお、これらの変更は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
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
- 🌐 Full:リモートファイルも含め型チェック
- 📁 Local:ローカルファイルのみ型チェック
- ❌ None:型チェックなし
これらの変更はDeno1.23(2022年6月リリース)で導入されます。それまでの間、変更後の挙動を試すには、環境変数DENO_FUTURE_CHECK=1
を設定します。
なぜこの変更が行われるのか
型チェックがdeno run
から分離される点
この提案は遡ること1年半前のdiscussionとissueで議論されていました。
変更に至った経緯は公式ブログに書かれています。
- Denoはlanguage server(エディタに補完や診断を出すやつ)の組み込みサポートがあるため、それを使って型チェックすることができる
- 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など)。