fix(types): filter symbol keys in Rpc.Serializable mapped type #5804
+1
−1
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Problem
Rpc.Serializable<T>fails to match valid serializable types when they include symbol keys (e.g.,Symbol.disposefromDisposable).When using
WorkflowStep.do()with a Durable Object stub return value:TypeScript errors:
Reproduction
https://github.com/dmmulroy/workerd-rpc-serializable-type-repro
Cause
The mapped type uses a value-side conditional that maps symbol keys to
neverinstead of filtering them out:This creates an object type that has the symbol keys but with
nevervalues, causing assignability failures.Fix
Use key remapping with
asclause to filter out non-string/number keys entirely:{ - [K in keyof T]: K extends number | string ? Serializable<T[K]> : never; + [K in keyof T as K extends string | number ? K : never]: Serializable<T[K]>; }Safety & Backwards Compatibility
This change is safe because:
Note
This PR was written with AI assistance.
AI Session Export