From 79ef1d69ac30a52cc61ecb78690faba22ead8582 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Wed, 3 May 2023 14:33:51 +0200 Subject: [PATCH] fix(ts): make `ReadonlyHeaders` more compatible with `Headers` (#49075) ### What? Make it possible to pass `headers()` where the `Headers` type is expected. An example would be `fetch`: ```ts import { headers } from "next/headers" // ... fetch("https://example.com", { headers: headers() }) ``` ### Why? `ReadonlyHeaders` _currently omits_ some mutating methods which make sense since they don't make sense. :upside_down_face:. However, it makes it necessary to pass the result anywhere where `Headers` is expected. Since we already throw errors when these methods are called illegally, we can make the type constraint a bit looser to avoid `as any` or `Object.fromEntries(headers())` or similar. ### How? Mark the unavailable methods as `@deprecated` which will visually mark them in IDEs: ![image](https://user-images.githubusercontent.com/18369201/235621140-3df8b10a-b90f-4ec3-b218-066303bfbc73.png) Closes NEXT-1075 --- .../src/server/web/spec-extension/adapters/headers.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/next/src/server/web/spec-extension/adapters/headers.ts b/packages/next/src/server/web/spec-extension/adapters/headers.ts index c5e9d2bd35a4..88d2e6536370 100644 --- a/packages/next/src/server/web/spec-extension/adapters/headers.ts +++ b/packages/next/src/server/web/spec-extension/adapters/headers.ts @@ -17,8 +17,14 @@ export class ReadonlyHeadersError extends Error { } } -export type ReadonlyHeaders = Omit - +export type ReadonlyHeaders = Headers & { + /** @deprecated Method unavailable on `ReadonlyHeaders`. Read more: https://nextjs.org/docs/api-reference/headers */ + append(...args: any[]): void + /** @deprecated Method unavailable on `ReadonlyHeaders`. Read more: https://nextjs.org/docs/api-reference/headers */ + set(...args: any[]): void + /** @deprecated Method unavailable on `ReadonlyHeaders`. Read more: https://nextjs.org/docs/api-reference/headers */ + delete(...args: any[]): void +} export class HeadersAdapter extends Headers { private readonly headers: IncomingHttpHeaders