From cf44dd02ca3a5340958aad6d6a736cfd0a9c0bbc Mon Sep 17 00:00:00 2001 From: Richard Date: Sun, 7 Jul 2024 01:50:12 -0700 Subject: [PATCH] fix(types): cover more `SyncPatch` cases --- src/index.d.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/index.d.ts b/src/index.d.ts index fd5ac0b..512d277 100644 --- a/src/index.d.ts +++ b/src/index.d.ts @@ -241,6 +241,8 @@ declare namespace Charm { readonly __none: "__none"; } + type MaybeNone = undefined extends T ? None : never; + /** * A partial patch that can be applied to the state to update it. Represents * the difference between the current state and the next state. @@ -248,11 +250,15 @@ declare namespace Charm { * If a value was removed, it is replaced with `None`. This can be checked * using the `sync.isNone` function. */ - type SyncPatch = { - readonly [P in keyof State]?: - | (State[P] extends object ? SyncPatch : State[P]) - | (undefined extends State[P] ? None : never); - }; + type SyncPatch = + | MaybeNone + | (State extends ReadonlyMap | Map + ? ReadonlyMap | None> + : State extends readonly (infer T)[] + ? readonly (SyncPatch | None | undefined)[] + : State extends object + ? { readonly [P in keyof State]?: SyncPatch } + : State); /** * A payload that can be sent from the server to the client to synchronize