Cloudflare Workersで動くコードを、TypeScript(JSDoc TSでも)で書く時には、型定義である@cloudflare/workers-types
を入れるのが基本。
それがないと、HTMLRewriter
みたくグローバルにあるやつも見えないし、Request
の.cf
プロパティも読めないし、KVNamespace
みたいな定義もないし、なぜかCloudflareだけが独自に実装してるcrypto.subtle.timingSafeEqual()
も存在しないことになっちゃうから。
で、それをインストールするとき、何気なくこうしてません?
{
"compilerOptions": {
"target": "esnext",
"module": "esnext",
"lib": ["esnext"],
"types": ["@cloudflare/workers-types"]
}
}
まあ間違ってはないけど、もしかしたら困るケースが出てくるかもしれない。
Compatiblity dates
wrangler.toml
にも似たような設定があるけど、この型定義にもある。
実は、@cloudflare/workers-types
というnpmのパッケージは、いくつかバージョン違いの型定義を公開してて、それがその名の通りCompatibility datesという特定日時でのスナップショットになってる。
@cloudflare/workers-types
って指定したときに参照される型定義は、実はもっとも古い日時のもので、それはなんと2021-11-03
以前というだいぶ前の定義になってる。
なんとなく、そこは最新のやつが入ってくるんでは?って思ってたけど、真逆だった。
なので新しい定義がほしい場合は、@cloudflare/workers-types/2022-11-30
のように指定する必要がある。
指定できる日時の一覧は、たぶんGitHubを見るのがよさそう・・・?
https://github.com/cloudflare/workerd/tree/main/npm/workers-types#compatibility-dates
というわけで
いつでも最新のものを使うようにしたい場合は、@cloudflare/workers-types/experimental
とする必要がある。
現時点での最新である2023-07-01
を指定したいなと思ったけど、なぜかnpmに公開されてなかったので、これはIssueを建てておいた。
@cloudflare/workers-types/2023-07-01 is not published to npm? · Issue #1108 · cloudflare/workerd https://github.com/cloudflare/workerd/issues/1108
みんな困ってないのね。
何に困ってたか
const fd = await req.formData();
const image = fd.get("image");
このとき、image
がなぜかstring | null
になっちゃうというもの。
TSの本体であるdom.d.ts
では、FormDataEntryValue | null
になってるところ。(FormDataEntryValue
は、File | string
)
experimental
だと(というか、いずれかの日時を指定してやれば)、ちゃんと(File | string) | null
になる。