🦕

Deno Deploy用コードで[deno-ts 2339]が発生するときの対処法

2021/07/05に公開

Deno Deployの勉強をしています。
https://zenn.dev/kawarimidoll/articles/b0a5064befcd31
本記事では、Deno Deploy用のコードを書いている際に遭遇した[deno-ts 2339]エラーの対処をまとめました。

発生するエラー

エラーはエディタ内で表示されるもので、[deno-ts 2339] [E] Property 'respondWith' does not exist on type 'Event'です。

例として、公式ドキュメントのHello Worldページのコードを使います。

https://deno.com/deploy/docs/hello-world

以下のようなものです。

server.ts
addEventListener("fetch", (event) => {
  const response = new Response("Hello World!", {
    headers: { "content-type": "text/plain" },
  });
  event.respondWith(response);
});

しかし、これだけのコードでも、前述のエラーが発生します。

respondWithなんてEventに定義されていないよ」という警告が出ています。
しかし、Deno Deploy環境やdeployctlでは無視して実行できるほか、deno lintでも特に怒られません。

つまり、あくまでlspが警告を出しているだけで、気にしなくてもよいものです。
とはいえ、開発中にずっとエラーが出てしまうのはあまり気持ちの良いものではありません。正直気になります。

対処法

deploy_feedbackのリポジトリにissueが上がっていました。
https://github.com/denoland/deploy_feedback/issues/13

で、以下のdeployctlのリポジトリのissueへ案内されていました。こちらの方法を使います。
https://github.com/denoland/deployctl/issues/24#issuecomment-819272065

まず型情報ファイルを生成します。

❯ deployctl types > deploy.d.ts

続いてserver.tsの先頭にTriple slash directiveを追加し、生成した型情報を参照します。
https://www.typescriptlang.org/docs/handbook/triple-slash-directives.html
server.tsdeploy.d.tsの相対パスが異なる場合は適宜調整してください。

server.ts
+ /// <reference path="./deploy.d.ts" />

  addEventListener("fetch", (event) => {
    const response = new Response("Hello Deno Deploy!", {
      headers: { "content-type": "text/plain" },
    });
    event.respondWith(response);
  });

これでエラーを消すことができます。

しかし今度はdeployctl run ./server.tsが失敗します。

正常に動作させるためには、実行時にlibsオプションを追加する必要があります。

❯ deployctl run --libs="" ./server.ts

以上でエラーの対処と実行用コマンドの調整は完了です。

とはいえ、毎度入力するのは面倒です。
Deno用タスクランナーのVelociraptorを使えば、毎回入力するコマンドを登録しておくことができます。

https://velociraptor.run

velociraptor.ymlに以下の記述を追加します。

velociraptor.yml
scripts:
  dev:
    desc: Starts local server
    cmd: deployctl run --libs="" --watch ./server.ts

これでvr devでローカルサーバーを立ち上げられます。

❯ vr dev

おわりに

Deno deploy用のコードで遭遇したエラーの対処法でした。

個人的には、今後Denoの開発を行う場合、Deno Deployで動かすことを前提として書くことが増えると思っています。
ということで、テンプレートに入れてしまいました。

https://github.com/kawarimidoll/deno-dev-template

これで、今後は環境の整った状態で開発をスタートできそうです。

Discussion