Description
As per DefinitelyTyped/DefinitelyTyped#66824 which was merged recently and released in @types/node@20.8.4
, Node.js now defines its own Request
, Response
, etc. types via undici-types
.
While this is great in Node environments, it completely messes with the Request
and Response
(maybe others?) types defined by @cloudflare/workers-types
.
Example code that used to work before:
type SomeType = {
foo: string
};
const response = await fetch(...);
const json = await response.json<SomeType>()
Now has a type error with: Expected 0 type arguments, but got 1.
.
Or:
const country = request?.cf?.country;
Now has a type error with `Property 'cf' does not exist on type 'Request'.
Or:
new Request(..., request);
Now has a type error with:
Argument of type 'Request' is not assignable to parameter of type 'RequestInit'.
Types of property 'referrerPolicy' are incompatible.
Type 'string' is not assignable to type 'ReferrerPolicy | undefined'.
Why load @types/node
?
This is a fair question, and you generally don't need to load @types/node
at all, and in fact, I don't directly. But, many dependencies that people use, do in fact require @types/node
, including the likes of @types/pg
, which is loaded by @neondatabase/serverless
.
It seems that once this newer version of @types/node
is loaded into memory at all, it just overrides the globally defined Request/Response/fetch types from @cloudflare/workers-types
.
Full reproduction
See the following github repo: https://github.com/Cherry/workers-node-types-issue-repro.
This showcases an example package that loads @types/node
, and if you comment in/out the import you'll see the type errors now show up.
Workaround
My current workaround for this is to pin @types/node
via npm overrides, with this in my package.json
:
{
"overrides": {
"@types/node": "20.8.3"
}
}
It's a very naive and short-term workaround, but works for now.
Metadata
Metadata
Assignees
Type
Projects
Status