diff --git a/src/workerd/api/http.h b/src/workerd/api/http.h index d363ba27205..69cfccaa735 100644 --- a/src/workerd/api/http.h +++ b/src/workerd/api/http.h @@ -436,7 +436,16 @@ class Fetcher: public JsRpcClientProvider { }); } JSG_TS_DEFINE( - type Service = Fetcher; + type Service< + T extends + | (new (...args: any[]) => Rpc.WorkerEntrypointBranded) + | Rpc.WorkerEntrypointBranded + | ExportedHandler + | undefined = undefined, + > = T extends new (...args: any[]) => Rpc.WorkerEntrypointBranded ? Fetcher> + : T extends Rpc.WorkerEntrypointBranded ? Fetcher + : T extends Exclude ? never + : Fetcher ); if (!flags.getFetcherNoGetPutDelete()) { diff --git a/types/generated-snapshot/experimental/index.d.ts b/types/generated-snapshot/experimental/index.d.ts index 6188a4d214e..6b34c9fb313 100755 --- a/types/generated-snapshot/experimental/index.d.ts +++ b/types/generated-snapshot/experimental/index.d.ts @@ -1761,8 +1761,19 @@ interface RequestInit { signal?: AbortSignal | null; encodeResponseBody?: "automatic" | "manual"; } -type Service = - Fetcher; +type Service< + T extends + | (new (...args: any[]) => Rpc.WorkerEntrypointBranded) + | Rpc.WorkerEntrypointBranded + | ExportedHandler + | undefined = undefined, +> = T extends new (...args: any[]) => Rpc.WorkerEntrypointBranded + ? Fetcher> + : T extends Rpc.WorkerEntrypointBranded + ? Fetcher + : T extends Exclude + ? never + : Fetcher; type Fetcher< T extends Rpc.EntrypointBranded | undefined = undefined, Reserved extends string = never, diff --git a/types/generated-snapshot/experimental/index.ts b/types/generated-snapshot/experimental/index.ts index c5cb34a5497..ca2fdcb6442 100755 --- a/types/generated-snapshot/experimental/index.ts +++ b/types/generated-snapshot/experimental/index.ts @@ -1770,8 +1770,18 @@ export interface RequestInit { encodeResponseBody?: "automatic" | "manual"; } export type Service< - T extends Rpc.WorkerEntrypointBranded | undefined = undefined, -> = Fetcher; + T extends + | (new (...args: any[]) => Rpc.WorkerEntrypointBranded) + | Rpc.WorkerEntrypointBranded + | ExportedHandler + | undefined = undefined, +> = T extends new (...args: any[]) => Rpc.WorkerEntrypointBranded + ? Fetcher> + : T extends Rpc.WorkerEntrypointBranded + ? Fetcher + : T extends Exclude + ? never + : Fetcher; export type Fetcher< T extends Rpc.EntrypointBranded | undefined = undefined, Reserved extends string = never, diff --git a/types/generated-snapshot/latest/index.d.ts b/types/generated-snapshot/latest/index.d.ts index f2a2104ca83..0a02e452f4e 100755 --- a/types/generated-snapshot/latest/index.d.ts +++ b/types/generated-snapshot/latest/index.d.ts @@ -1727,8 +1727,19 @@ interface RequestInit { signal?: AbortSignal | null; encodeResponseBody?: "automatic" | "manual"; } -type Service = - Fetcher; +type Service< + T extends + | (new (...args: any[]) => Rpc.WorkerEntrypointBranded) + | Rpc.WorkerEntrypointBranded + | ExportedHandler + | undefined = undefined, +> = T extends new (...args: any[]) => Rpc.WorkerEntrypointBranded + ? Fetcher> + : T extends Rpc.WorkerEntrypointBranded + ? Fetcher + : T extends Exclude + ? never + : Fetcher; type Fetcher< T extends Rpc.EntrypointBranded | undefined = undefined, Reserved extends string = never, diff --git a/types/generated-snapshot/latest/index.ts b/types/generated-snapshot/latest/index.ts index 65fb59d2497..7839e1e0878 100755 --- a/types/generated-snapshot/latest/index.ts +++ b/types/generated-snapshot/latest/index.ts @@ -1736,8 +1736,18 @@ export interface RequestInit { encodeResponseBody?: "automatic" | "manual"; } export type Service< - T extends Rpc.WorkerEntrypointBranded | undefined = undefined, -> = Fetcher; + T extends + | (new (...args: any[]) => Rpc.WorkerEntrypointBranded) + | Rpc.WorkerEntrypointBranded + | ExportedHandler + | undefined = undefined, +> = T extends new (...args: any[]) => Rpc.WorkerEntrypointBranded + ? Fetcher> + : T extends Rpc.WorkerEntrypointBranded + ? Fetcher + : T extends Exclude + ? never + : Fetcher; export type Fetcher< T extends Rpc.EntrypointBranded | undefined = undefined, Reserved extends string = never, diff --git a/types/test/types/rpc.ts b/types/test/types/rpc.ts index 9a3c8812524..9a6b5ee8397 100644 --- a/types/test/types/rpc.ts +++ b/types/test/types/rpc.ts @@ -406,11 +406,10 @@ class TestNaughtyObject extends DurableObject { interface Env { REGULAR_SERVICE: Service; RPC_SERVICE: Service; + TYPEOF_RPC_SERVICE: Service; NAUGHTY_SERVICE: Service; // @ts-expect-error `BoringClass` isn't an RPC capable type __INVALID_RPC_SERVICE_1: Service; - // @ts-expect-error `TestEntrypoint` is a `DurableObject`, not a `WorkerEntrypoint` - __INVALID_RPC_SERVICE_2: Service; REGULAR_OBJECT: DurableObjectNamespace; RPC_OBJECT: DurableObjectNamespace;