From 09429df522cb1d43c5ead365035b959e9d035c6b Mon Sep 17 00:00:00 2001 From: "H.Alper Tuna" Date: Tue, 8 Oct 2024 02:13:09 +0300 Subject: [PATCH] Further fixes for the Serializable type - Fixed Serializable to properly resolve structured composite types. - Fixed missing generic types in Serializable usages. - Fixed issue where interfaces were not being stubified. --- types/defines/rpc.d.ts | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/types/defines/rpc.d.ts b/types/defines/rpc.d.ts index bb9934df4cd..88b54d11266 100644 --- a/types/defines/rpc.d.ts +++ b/types/defines/rpc.d.ts @@ -32,6 +32,9 @@ declare namespace Rpc { export type Stubable = RpcTargetBranded | ((...args: any[]) => any); // Types that can be passed over RPC + // The reason for using a generic type here is to build a serializable subset of structured + // cloneable composite types. This allows types defined with the "interface" keyword to pass the + // serializable check as well. Otherwise, only types defined with the "type" keyword would pass. type Serializable = // Structured cloneables | void @@ -48,9 +51,12 @@ declare namespace Rpc { | Error | RegExp // Structured cloneable composites - | Map, Serializable> - | Set> - | ReadonlyArray> + | Map< + T extends Map ? Serializable : never, + T extends Map ? Serializable : never + > + | Set ? Serializable : never> + | ReadonlyArray ? Serializable : never> | { [K in keyof T]: K extends number | string ? Serializable : never; } @@ -80,7 +86,8 @@ declare namespace Rpc { : T extends Set ? Set> : T extends Array ? Array> : T extends ReadonlyArray ? ReadonlyArray> - : T extends { [key: string | number]: unknown } ? { [K in keyof T]: Stubify } + // When using "unknown" instead of "any", interfaces are not stubified. + : T extends { [key: string | number]: any } ? { [K in keyof T]: Stubify } : T; // Recursively rewrite all `Stub`s with the corresponding `T`s. @@ -227,7 +234,7 @@ declare module "cloudflare:workers" { }; export type WorkflowStep = { - do: ( + do: >( name: string, callback: () => Promise, config?: WorkflowStepConfig @@ -240,7 +247,7 @@ declare module "cloudflare:workers" { export abstract class Workflow< Env = unknown, - T extends Rpc.Serializable | unknown = unknown, + T extends Rpc.Serializable | unknown = unknown, > implements Rpc.WorkflowBranded { [Rpc.__WORKFLOW_BRAND]: never;