Skip to content

Commit a86210a

Browse files
authored
feat(types): allow Service<T> to handle non-WorkerEntrypoint default export (#4588)
* feat(types): allow Service<T> to handle non-WorkerEntrypoint default export * restrict types accepted * unwrap condition to avoid Fetcher<never>
1 parent 7418fe9 commit a86210a

File tree

6 files changed

+61
-11
lines changed

6 files changed

+61
-11
lines changed

src/workerd/api/http.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,16 @@ class Fetcher: public JsRpcClientProvider {
436436
});
437437
}
438438
JSG_TS_DEFINE(
439-
type Service<T extends Rpc.WorkerEntrypointBranded | undefined = undefined> = Fetcher<T>;
439+
type Service<
440+
T extends
441+
| (new (...args: any[]) => Rpc.WorkerEntrypointBranded)
442+
| Rpc.WorkerEntrypointBranded
443+
| ExportedHandler<any, any, any>
444+
| undefined = undefined,
445+
> = T extends new (...args: any[]) => Rpc.WorkerEntrypointBranded ? Fetcher<InstanceType<T>>
446+
: T extends Rpc.WorkerEntrypointBranded ? Fetcher<T>
447+
: T extends Exclude<Rpc.EntrypointBranded, Rpc.WorkerEntrypointBranded> ? never
448+
: Fetcher<undefined>
440449
);
441450

442451
if (!flags.getFetcherNoGetPutDelete()) {

types/generated-snapshot/experimental/index.d.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1760,8 +1760,19 @@ interface RequestInit<Cf = CfProperties> {
17601760
signal?: AbortSignal | null;
17611761
encodeResponseBody?: "automatic" | "manual";
17621762
}
1763-
type Service<T extends Rpc.WorkerEntrypointBranded | undefined = undefined> =
1764-
Fetcher<T>;
1763+
type Service<
1764+
T extends
1765+
| (new (...args: any[]) => Rpc.WorkerEntrypointBranded)
1766+
| Rpc.WorkerEntrypointBranded
1767+
| ExportedHandler<any, any, any>
1768+
| undefined = undefined,
1769+
> = T extends new (...args: any[]) => Rpc.WorkerEntrypointBranded
1770+
? Fetcher<InstanceType<T>>
1771+
: T extends Rpc.WorkerEntrypointBranded
1772+
? Fetcher<T>
1773+
: T extends Exclude<Rpc.EntrypointBranded, Rpc.WorkerEntrypointBranded>
1774+
? never
1775+
: Fetcher<undefined>;
17651776
type Fetcher<
17661777
T extends Rpc.EntrypointBranded | undefined = undefined,
17671778
Reserved extends string = never,

types/generated-snapshot/experimental/index.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1769,8 +1769,18 @@ export interface RequestInit<Cf = CfProperties> {
17691769
encodeResponseBody?: "automatic" | "manual";
17701770
}
17711771
export type Service<
1772-
T extends Rpc.WorkerEntrypointBranded | undefined = undefined,
1773-
> = Fetcher<T>;
1772+
T extends
1773+
| (new (...args: any[]) => Rpc.WorkerEntrypointBranded)
1774+
| Rpc.WorkerEntrypointBranded
1775+
| ExportedHandler<any, any, any>
1776+
| undefined = undefined,
1777+
> = T extends new (...args: any[]) => Rpc.WorkerEntrypointBranded
1778+
? Fetcher<InstanceType<T>>
1779+
: T extends Rpc.WorkerEntrypointBranded
1780+
? Fetcher<T>
1781+
: T extends Exclude<Rpc.EntrypointBranded, Rpc.WorkerEntrypointBranded>
1782+
? never
1783+
: Fetcher<undefined>;
17741784
export type Fetcher<
17751785
T extends Rpc.EntrypointBranded | undefined = undefined,
17761786
Reserved extends string = never,

types/generated-snapshot/latest/index.d.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1727,8 +1727,19 @@ interface RequestInit<Cf = CfProperties> {
17271727
signal?: AbortSignal | null;
17281728
encodeResponseBody?: "automatic" | "manual";
17291729
}
1730-
type Service<T extends Rpc.WorkerEntrypointBranded | undefined = undefined> =
1731-
Fetcher<T>;
1730+
type Service<
1731+
T extends
1732+
| (new (...args: any[]) => Rpc.WorkerEntrypointBranded)
1733+
| Rpc.WorkerEntrypointBranded
1734+
| ExportedHandler<any, any, any>
1735+
| undefined = undefined,
1736+
> = T extends new (...args: any[]) => Rpc.WorkerEntrypointBranded
1737+
? Fetcher<InstanceType<T>>
1738+
: T extends Rpc.WorkerEntrypointBranded
1739+
? Fetcher<T>
1740+
: T extends Exclude<Rpc.EntrypointBranded, Rpc.WorkerEntrypointBranded>
1741+
? never
1742+
: Fetcher<undefined>;
17321743
type Fetcher<
17331744
T extends Rpc.EntrypointBranded | undefined = undefined,
17341745
Reserved extends string = never,

types/generated-snapshot/latest/index.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1736,8 +1736,18 @@ export interface RequestInit<Cf = CfProperties> {
17361736
encodeResponseBody?: "automatic" | "manual";
17371737
}
17381738
export type Service<
1739-
T extends Rpc.WorkerEntrypointBranded | undefined = undefined,
1740-
> = Fetcher<T>;
1739+
T extends
1740+
| (new (...args: any[]) => Rpc.WorkerEntrypointBranded)
1741+
| Rpc.WorkerEntrypointBranded
1742+
| ExportedHandler<any, any, any>
1743+
| undefined = undefined,
1744+
> = T extends new (...args: any[]) => Rpc.WorkerEntrypointBranded
1745+
? Fetcher<InstanceType<T>>
1746+
: T extends Rpc.WorkerEntrypointBranded
1747+
? Fetcher<T>
1748+
: T extends Exclude<Rpc.EntrypointBranded, Rpc.WorkerEntrypointBranded>
1749+
? never
1750+
: Fetcher<undefined>;
17411751
export type Fetcher<
17421752
T extends Rpc.EntrypointBranded | undefined = undefined,
17431753
Reserved extends string = never,

types/test/types/rpc.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -406,11 +406,10 @@ class TestNaughtyObject extends DurableObject {
406406
interface Env {
407407
REGULAR_SERVICE: Service;
408408
RPC_SERVICE: Service<TestEntrypoint>;
409+
TYPEOF_RPC_SERVICE: Service<typeof TestEntrypoint>;
409410
NAUGHTY_SERVICE: Service<TestNaughtyEntrypoint>;
410411
// @ts-expect-error `BoringClass` isn't an RPC capable type
411412
__INVALID_RPC_SERVICE_1: Service<BoringClass>;
412-
// @ts-expect-error `TestEntrypoint` is a `DurableObject`, not a `WorkerEntrypoint`
413-
__INVALID_RPC_SERVICE_2: Service<TestObject>;
414413

415414
REGULAR_OBJECT: DurableObjectNamespace;
416415
RPC_OBJECT: DurableObjectNamespace<TestObject>;

0 commit comments

Comments
 (0)