5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-04-11

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

image.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

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年半前のdiscussionissueで議論されていました。

変更に至った経緯は公式ブログに書かれています。

  • 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-rundeno 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など)。

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?