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.
As per DefinitelyTyped/DefinitelyTyped#66824 which was merged recently and released in
@types/node@20.8.4, Node.js now defines its ownRequest,Response, etc. types viaundici-types.While this is great in Node environments, it completely messes with the
RequestandResponse(maybe others?) types defined by@cloudflare/workers-types.Example code that used to work before:
Now has a type error with:
Expected 0 type arguments, but got 1..Or:
Now has a type error with `Property 'cf' does not exist on type 'Request'.
Or:
Now has a type error with:
Why load
@types/node?This is a fair question, and you generally don't need to load
@types/nodeat 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/nodeis 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/nodevia npm overrides, with this in mypackage.json:{ "overrides": { "@types/node": "20.8.3" } }It's a very naive and short-term workaround, but works for now.