Skip to content

Commit f0d192a

Browse files
committed
make immer more generic
1 parent 5477b3d commit f0d192a

File tree

1 file changed

+17
-6
lines changed

1 file changed

+17
-6
lines changed

src/middleware/immer.ts

+17-6
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,19 @@ declare module 'zustand' {
1818
}
1919

2020
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
2134

2235
type WithImmer<S> = S extends {
2336
getState: () => infer T
@@ -26,13 +39,11 @@ type WithImmer<S> = S extends {
2639
? Write<
2740
S,
2841
{
29-
setState: SetState extends (
30-
...a: [infer _, infer __, ...infer A]
31-
) => infer Sr
42+
setState: SetState extends (...a: infer A) => infer Sr
3243
? <Nt extends R extends true ? T : Partial<T>, R extends boolean>(
3344
nextStateOrUpdater: Nt | ((state: Draft<T>) => void),
3445
shouldReplace?: R,
35-
...a: A
46+
...a: SkipTwo<A>
3647
) => Sr
3748
: never
3849
}
@@ -52,12 +63,12 @@ type ImmerImpl = <T extends State>(
5263
const immerImpl: ImmerImpl = (initializer) => (set, get, store) => {
5364
type T = ReturnType<typeof initializer>
5465

55-
store.setState = (updater, replace) => {
66+
store.setState = (updater, replace, ...a) => {
5667
const nextState = (
5768
typeof updater === 'function' ? produce(updater as any) : updater
5869
) as ((s: T) => T) | T | Partial<T>
5970

60-
return set(nextState as any, replace)
71+
return set(nextState as any, replace, ...a)
6172
}
6273

6374
return initializer(store.setState, get, store)

0 commit comments

Comments
 (0)