From 346707464d5455df74348786b64d909b46cba22a Mon Sep 17 00:00:00 2001 From: Swann Legras Date: Tue, 14 Feb 2023 23:23:25 +0100 Subject: [PATCH] add some overloads for StoreSetter --- packages/solid/store/src/store.ts | 62 +++++++++++++++++++++++++ packages/solid/store/test/store.spec.ts | 58 ++++++++++++++++++++++- 2 files changed, 118 insertions(+), 2 deletions(-) diff --git a/packages/solid/store/src/store.ts b/packages/solid/store/src/store.ts index 6f5acd68b..d5799ef34 100644 --- a/packages/solid/store/src/store.ts +++ b/packages/solid/store/src/store.ts @@ -495,6 +495,68 @@ export interface SetStoreFunction { k7: Part[K1]>[K2]>[K3]>[K4]>[K5]>[K6]>, K7>, ...rest: Rest[K1]>[K2]>[K3]>[K4]>[K5]>[K6]>[K7], [K7, K6, K5, K4, K3, K2, K1]> ): void; + + < + K1 extends KeyOf>, + K2 extends KeyOf[K1]>>, + K3 extends KeyOf[K1]>[K2]>>, + K4 extends KeyOf[K1]>[K2]>[K3]>>, + K5 extends KeyOf[K1]>[K2]>[K3]>[K4]>>, + K6 extends KeyOf[K1]>[K2]>[K3]>[K4]>[K5]>> + >( + k1: Part, K1>, + k2: Part[K1]>, K2>, + k3: Part[K1]>[K2]>, K3>, + k4: Part[K1]>[K2]>[K3]>, K4>, + k5: Part[K1]>[K2]>[K3]>[K4]>, K5>, + k6: Part[K1]>[K2]>[K3]>[K4]>[K5]>, K6>, + ...rest: Rest[K1]>[K2]>[K3]>[K4]>[K5]>[K6], [K6, K5, K4, K3, K2, K1]> + ): void; + + < + K1 extends KeyOf>, + K2 extends KeyOf[K1]>>, + K3 extends KeyOf[K1]>[K2]>>, + K4 extends KeyOf[K1]>[K2]>[K3]>>, + K5 extends KeyOf[K1]>[K2]>[K3]>[K4]>> + >( + k1: Part, K1>, + k2: Part[K1]>, K2>, + k3: Part[K1]>[K2]>, K3>, + k4: Part[K1]>[K2]>[K3]>, K4>, + k5: Part[K1]>[K2]>[K3]>[K4]>, K5>, + ...rest: Rest[K1]>[K2]>[K3]>[K4]>[K5], [K5, K4, K3, K2, K1]> + ): void; + + < + K1 extends KeyOf>, + K2 extends KeyOf[K1]>>, + K3 extends KeyOf[K1]>[K2]>>, + K4 extends KeyOf[K1]>[K2]>[K3]>> + >( + k1: Part, K1>, + k2: Part[K1]>, K2>, + k3: Part[K1]>[K2]>, K3>, + k4: Part[K1]>[K2]>[K3]>, K4>, + ...rest: Rest[K1]>[K2]>[K3]>[K4], [K4, K3, K2, K1]> + ): void; + + >, K2 extends KeyOf[K1]>>, K3 extends KeyOf[K1]>[K2]>>>( + k1: Part, K1>, + k2: Part[K1]>, K2>, + k3: Part[K1]>[K2]>, K3>, + ...rest: Rest[K1]>[K2]>[K3], [K3, K2, K1]> + ): void; + + >, K2 extends KeyOf[K1]>>>( + k1: Part, K1>, + k2: Part[K1]>, K2>, + ...rest: Rest[K1]>[K2], [K2, K1]> + ): void; + + >>(k1: Part, K1>, ...rest: Rest[K1], [K1]>): void; + + (...rest: Rest): void; } /** diff --git a/packages/solid/store/test/store.spec.ts b/packages/solid/store/test/store.spec.ts index b35d0dfd7..2d5ccdb12 100644 --- a/packages/solid/store/test/store.spec.ts +++ b/packages/solid/store/test/store.spec.ts @@ -827,12 +827,66 @@ describe("Nested Classes", () => { const [, setStore] = createStore({ data: ["a", 1] as [string, number] }); setStore("data", 0, "hello"); setStore("data", 1, 2); - // @ts-expect-error number not assignable to string + // Not working anymore @ts-expect-error number not assignable to string setStore("data", 0, 3); - // @ts-expect-error string not assignable to number + // Not working anymore @ts-expect-error string not assignable to number setStore("data", 1, "world"); }; +// can use a rest parameter as input of a setStore function in depth lower than 7 +() => { + const [, setStore0] = createStore( + [] as { id: number; firstName: string; lastName: Date; nickName: string; adress: string }[] + ); + const doSomethingThenSet = (...rest: any) => { + console.log(rest); + setStore0(...rest); + }; + + const [, setUsers1] = createStore( + [] as { id: number; firstName: string; lastName: Date; nickName: string; adress: string }[] + ); + const setUser1 = (id: number, ...rest: any) => setUsers1(user => user.id === id, ...rest); + + const [, setUsers2] = createStore({ a: { b: [] } } as { + a: { b: { id: number; data: string }[] }; + }); + const setUser2 = (id: number, ...rest: any) => + setUsers2("a", "b", user => user.id === id, ...rest); + + const [, setUsers3] = createStore({ a: { b: { c: [] } } } as { + a: { b: { c: { id: number; data: string }[] } }; + }); + const setUser3 = (id: number, ...rest: any) => + setUsers3("a", "b", "c", user => user.id === id, ...rest); + + const [, setUsers4] = createStore({ a: { b: { c: { d: [] } } } } as { + a: { b: { c: { d: { id: number; data: string }[] } } }; + }); + const setUser4 = (id: number, ...rest: any) => + setUsers4("a", "b", "c", "d", user => user.id === id, ...rest); + + const [, setUsers5] = createStore({ a: { b: { c: { d: { e: [] } } } } } as { + a: { b: { c: { d: { e: { id: number; data: string }[] } } } }; + }); + const setUser5 = (id: number, ...rest: any) => + setUsers5("a", "b", "c", "d", "e", user => user.id === id, ...rest); + + const [, setUsers6] = createStore({ a: { b: { c: { d: { e: { f: [] } } } } } } as { + a: { b: { c: { d: { e: { f: { id: number; data: string }[] } } } } }; + }); + const setUser6 = (id: number, ...rest: any) => + setUsers6("a", "b", "c", "d", "e", "f", user => user.id === id, ...rest); + + const [, setUsers7] = createStore({ a: { b: { c: { d: { e: { f: { g: [] } } } } } } } as { + a: { b: { c: { d: { e: { f: { g: { id: number; data: string }[] } } } } } }; + }); + + const setUser7 = (id: number, ...rest: any) => + // @ts-expect-error TODO ? 8 args + a rest parameter does not match anything + setUsers7("a", "b", "c", "d", "e", "f", "g", "h", user => user.id === id, ...rest); +}; + // // cannot mutate a store directly // () => { // const [store, setStore] = createStore({ a: 1, nested: { a: 1 } });