@@ -2,7 +2,8 @@ import produce, {
2
2
produce as produce2 ,
3
3
applyPatches ,
4
4
Patch ,
5
- nothing
5
+ nothing ,
6
+ Draft
6
7
} from "../dist/immer.js"
7
8
8
9
// prettier-ignore
@@ -67,27 +68,28 @@ it("can update readonly state via standard api", () => {
67
68
68
69
// NOTE: only when the function type is inferred
69
70
it ( "can infer state type from default state" , ( ) => {
70
- type Producer = ( base : number | undefined ) => number
71
-
72
- let foo : Producer = { } as any
73
- exactType ( produce ( _ => { } , 1 ) , foo )
74
- exactType ( foo ( 2 ) , { } as number )
71
+ type Producer = < T > (
72
+ base : ( T extends number ? T : number ) | undefined
73
+ ) => number
74
+ let foo = produce ( _ => { } , 1 )
75
+ exactType ( foo , { } as Producer )
76
+ exactType ( foo ( 2 ) , 0 as number )
75
77
} )
76
78
77
79
it ( "can infer state type from recipe function" , ( ) => {
78
- type Producer = (
79
- base : string | number | undefined ,
80
+ type Base = string | number
81
+ type Producer = < T > (
82
+ base : ( T extends Base ? T : Base ) | undefined ,
80
83
_2 : number
81
- ) => string | number
84
+ ) => Base
82
85
83
- let foo : Producer = { } as any
84
- let recipe = ( _ : string | number , _2 : number ) => { }
85
- exactType ( produce ( recipe , 1 ) , foo )
86
+ let foo = produce ( ( _ : string | number , _2 : number ) => { } , 1 )
87
+ exactType ( foo , { } as Producer )
86
88
exactType ( foo ( "" , 0 ) , { } as string | number )
87
89
} )
88
90
89
91
it ( "cannot infer state type when the function type and default state are missing" , ( ) => {
90
- exactType ( produce ( _ => { } ) , { } as ( base : any ) => any )
92
+ exactType ( produce ( _ => { } ) , { } as < T > ( base : T ) => any )
91
93
} )
92
94
93
95
it ( "can update readonly state via curried api" , ( ) => {
@@ -138,13 +140,21 @@ it("can apply patches", () => {
138
140
} )
139
141
140
142
it ( "can provide rest parameters to a curried producer" , ( ) => {
141
- type Foo = ( base : object , _2 : number , _3 : number ) => object
143
+ type Foo = < T > (
144
+ base : Draft < T > extends { } ? T : object ,
145
+ _2 : number ,
146
+ _3 : number
147
+ ) => object
142
148
let foo = produce ( ( _1 : object , _2 : number , _3 : number ) => { } )
143
149
exactType ( foo , { } as Foo )
144
150
foo ( { } , 1 , 2 )
145
151
146
152
// With initial state:
147
- type Bar = ( base : object | undefined , _2 : number , _3 : number ) => object
153
+ type Bar = < T > (
154
+ base : ( Draft < T > extends { } ? T : object ) | undefined ,
155
+ _2 : number ,
156
+ _3 : number
157
+ ) => object
148
158
let bar = produce ( ( _1 : object , _2 : number , _3 : number ) => { } , { } )
149
159
exactType ( bar , { } as Bar )
150
160
bar ( undefined , 1 , 2 )
0 commit comments