@@ -2,7 +2,8 @@ import produce, {
22 produce as produce2 ,
33 applyPatches ,
44 Patch ,
5- nothing
5+ nothing ,
6+ Draft
67} from "../dist/immer.js"
78
89// prettier-ignore
@@ -67,27 +68,28 @@ it("can update readonly state via standard api", () => {
6768
6869// NOTE: only when the function type is inferred
6970it ( "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 )
7577} )
7678
7779it ( "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 ,
8083 _2 : number
81- ) => string | number
84+ ) => Base
8285
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 )
8688 exactType ( foo ( "" , 0 ) , { } as string | number )
8789} )
8890
8991it ( "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 )
9193} )
9294
9395it ( "can update readonly state via curried api" , ( ) => {
@@ -138,13 +140,21 @@ it("can apply patches", () => {
138140} )
139141
140142it ( "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
142148 let foo = produce ( ( _1 : object , _2 : number , _3 : number ) => { } )
143149 exactType ( foo , { } as Foo )
144150 foo ( { } , 1 , 2 )
145151
146152 // 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
148158 let bar = produce ( ( _1 : object , _2 : number , _3 : number ) => { } , { } )
149159 exactType ( bar , { } as Bar )
150160 bar ( undefined , 1 , 2 )
0 commit comments