Deno Deploy用コードで[deno-ts 2339]が発生するときの対処法
Deno Deployの勉強をしています。[deno-ts 2339]
エラーの対処をまとめました。
発生するエラー
エラーはエディタ内で表示されるもので、[deno-ts 2339] [E] Property 'respondWith' does not exist on type 'Event'
です。
例として、公式ドキュメントのHello Worldページのコードを使います。
以下のようなものです。
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が上がっていました。
で、以下のdeployctlのリポジトリのissueへ案内されていました。こちらの方法を使います。
まず型情報ファイルを生成します。
❯ deployctl types > deploy.d.ts
続いてserver.ts
の先頭にTriple slash directiveを追加し、生成した型情報を参照します。
server.ts
とdeploy.d.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を使えば、毎回入力するコマンドを登録しておくことができます。
velociraptor.yml
に以下の記述を追加します。
scripts:
dev:
desc: Starts local server
cmd: deployctl run --libs="" --watch ./server.ts
これでvr dev
でローカルサーバーを立ち上げられます。
❯ vr dev
おわりに
Deno deploy用のコードで遭遇したエラーの対処法でした。
個人的には、今後Denoの開発を行う場合、Deno Deployで動かすことを前提として書くことが増えると思っています。
ということで、テンプレートに入れてしまいました。
これで、今後は環境の整った状態で開発をスタートできそうです。
Discussion