@@ -18,6 +18,19 @@ declare module 'zustand' {
18
18
}
19
19
20
20
type Write < T extends object , U extends object > = Omit < T , keyof U > & U
21
+ type SkipTwo < T > = T extends [ ]
22
+ ? [ ]
23
+ : T extends [ unknown ]
24
+ ? [ ]
25
+ : T extends [ unknown ?]
26
+ ? [ ]
27
+ : T extends [ unknown , unknown , ...infer A ]
28
+ ? A
29
+ : T extends [ unknown , unknown ?, ...infer A ]
30
+ ? A
31
+ : T extends [ unknown ?, unknown ?, ...infer A ]
32
+ ? A
33
+ : never
21
34
22
35
type WithImmer < S > = S extends {
23
36
getState : ( ) => infer T
@@ -26,13 +39,11 @@ type WithImmer<S> = S extends {
26
39
? Write <
27
40
S ,
28
41
{
29
- setState : SetState extends (
30
- ...a : [ infer _ , infer __ , ...infer A ]
31
- ) => infer Sr
42
+ setState : SetState extends ( ...a : infer A ) => infer Sr
32
43
? < Nt extends R extends true ? T : Partial < T > , R extends boolean > (
33
44
nextStateOrUpdater : Nt | ( ( state : Draft < T > ) => void ) ,
34
45
shouldReplace ?: R ,
35
- ...a : A
46
+ ...a : SkipTwo < A >
36
47
) => Sr
37
48
: never
38
49
}
@@ -52,12 +63,12 @@ type ImmerImpl = <T extends State>(
52
63
const immerImpl : ImmerImpl = ( initializer ) => ( set , get , store ) => {
53
64
type T = ReturnType < typeof initializer >
54
65
55
- store . setState = ( updater , replace ) => {
66
+ store . setState = ( updater , replace , ... a ) => {
56
67
const nextState = (
57
68
typeof updater === 'function' ? produce ( updater as any ) : updater
58
69
) as ( ( s : T ) => T ) | T | Partial < T >
59
70
60
- return set ( nextState as any , replace )
71
+ return set ( nextState as any , replace , ... a )
61
72
}
62
73
63
74
return initializer ( store . setState , get , store )
0 commit comments