@@ -243,8 +243,10 @@ describe('type tests', () => {
243243 selector ( { foo : 'fizz' } , { bar : 'baz' } )
244244
245245 const ret = selector ( { foo : 'fizz' } , { bar : 42 } )
246- const foo : string = ret . foo
247- const bar : number = ret . bar
246+
247+ expectTypeOf ( ret ) . toHaveProperty ( 'foo' ) . toBeString ( )
248+
249+ expectTypeOf ( ret ) . toHaveProperty ( 'bar' ) . toBeNumber ( )
248250
249251 const selector2 = createSelector (
250252 ( state : State ) => state . foo ,
@@ -263,7 +265,7 @@ describe('type tests', () => {
263265 } )
264266 )
265267
266- selector2 ( { foo : 'fizz' } , { bar : 42 } )
268+ expectTypeOf ( selector2 ) . toBeCallableWith ( { foo : 'fizz' } , { bar : 42 } )
267269
268270 const selector3 = createSelector (
269271 ( s : State ) => s . foo ,
@@ -274,8 +276,7 @@ describe('type tests', () => {
274276 }
275277 )
276278
277- // @ts -expect-error
278- selector3 ( { foo : 'fizz' } , 42 )
279+ expectTypeOf ( selector3 ) . parameter ( 1 ) . toBeNever ( )
279280
280281 const selector4 = createSelector (
281282 ( s : State , val : number ) => s . foo ,
@@ -285,7 +286,7 @@ describe('type tests', () => {
285286 }
286287 )
287288
288- selector4 ( { foo : 'fizz' } , 42 )
289+ expectTypeOf ( selector4 ) . toBeCallableWith ( { foo : 'fizz' } , 42 )
289290 } )
290291
291292 test ( 'array argument' , ( ) => {
@@ -299,9 +300,12 @@ describe('type tests', () => {
299300 )
300301
301302 const ret = selector ( { foo : 'fizz' } , { bar : 42 } )
302- const foo1 : string = ret . foo1
303- const foo2 : string = ret . foo2
304- const bar : number = ret . bar
303+
304+ expectTypeOf ( ret ) . toHaveProperty ( 'foo1' ) . toBeString ( )
305+
306+ expectTypeOf ( ret ) . toHaveProperty ( 'foo2' ) . toBeString ( )
307+
308+ expectTypeOf ( ret ) . toHaveProperty ( 'bar' ) . toBeNumber ( )
305309
306310 // @ts -expect-error
307311 createSelector ( [ ( state : { foo : string } ) => state . foo ] )
@@ -424,21 +428,29 @@ describe('type tests', () => {
424428
425429 {
426430 const ret = selector2 ( { foo : 'fizz' } )
427- const foo1 : string = ret . foo1
428- const foo2 : string = ret . foo2
429- const foo3 : string = ret . foo3
430- const foo4 : string = ret . foo4
431- const foo5 : string = ret . foo5
432- const foo6 : string = ret . foo6
433- const foo7 : string = ret . foo7
434- const foo8 : string = ret . foo8
435- const foo9 : string = ret . foo9
436- // @ts -expect-error
437- ret . foo10
431+
432+ expectTypeOf ( ret ) . toHaveProperty ( 'foo1' ) . toBeString ( )
433+
434+ expectTypeOf ( ret ) . toHaveProperty ( 'foo2' ) . toBeString ( )
435+
436+ expectTypeOf ( ret ) . toHaveProperty ( 'foo3' ) . toBeString ( )
437+
438+ expectTypeOf ( ret ) . toHaveProperty ( 'foo4' ) . toBeString ( )
439+
440+ expectTypeOf ( ret ) . toHaveProperty ( 'foo5' ) . toBeString ( )
441+
442+ expectTypeOf ( ret ) . toHaveProperty ( 'foo6' ) . toBeString ( )
443+
444+ expectTypeOf ( ret ) . toHaveProperty ( 'foo7' ) . toBeString ( )
445+
446+ expectTypeOf ( ret ) . toHaveProperty ( 'foo8' ) . toBeString ( )
447+
448+ expectTypeOf ( ret ) . toHaveProperty ( 'foo9' ) . toBeString ( )
449+
450+ expectTypeOf ( ret ) . not . toHaveProperty ( 'foo10' )
438451 }
439452
440- // @ts -expect-error
441- selector2 ( { foo : 'fizz' } , { bar : 42 } )
453+ expectTypeOf ( selector2 ) . parameters . not . toHaveProperty ( '1' )
442454
443455 const parametric = createSelector (
444456 [
@@ -500,17 +512,26 @@ describe('type tests', () => {
500512
501513 {
502514 const ret = parametric ( { foo : 'fizz' } , { bar : 42 } )
503- const foo1 : string = ret . foo1
504- const foo2 : string = ret . foo2
505- const foo3 : string = ret . foo3
506- const foo4 : string = ret . foo4
507- const foo5 : string = ret . foo5
508- const foo6 : string = ret . foo6
509- const foo7 : string = ret . foo7
510- const foo8 : string = ret . foo8
511- const bar : number = ret . bar
512- // @ts -expect-error
513- ret . foo9
515+
516+ expectTypeOf ( ret ) . toHaveProperty ( 'foo1' ) . toBeString ( )
517+
518+ expectTypeOf ( ret ) . toHaveProperty ( 'foo2' ) . toBeString ( )
519+
520+ expectTypeOf ( ret ) . toHaveProperty ( 'foo3' ) . toBeString ( )
521+
522+ expectTypeOf ( ret ) . toHaveProperty ( 'foo4' ) . toBeString ( )
523+
524+ expectTypeOf ( ret ) . toHaveProperty ( 'foo5' ) . toBeString ( )
525+
526+ expectTypeOf ( ret ) . toHaveProperty ( 'foo6' ) . toBeString ( )
527+
528+ expectTypeOf ( ret ) . toHaveProperty ( 'foo7' ) . toBeString ( )
529+
530+ expectTypeOf ( ret ) . toHaveProperty ( 'foo8' ) . toBeString ( )
531+
532+ expectTypeOf ( ret ) . toHaveProperty ( 'bar' ) . toBeNumber ( )
533+
534+ expectTypeOf ( ret ) . not . toHaveProperty ( 'foo9' )
514535 }
515536 } )
516537
@@ -526,9 +547,9 @@ describe('type tests', () => {
526547 ( state : State , arg : string ) => arg ,
527548 ( state : State , arg : number ) => arg ,
528549 baz => {
529- const baz1 : boolean = baz
530- // @ts -expect-error
531- const baz2 : number = baz
550+ expectTypeOf ( baz ) . toBeBoolean ( )
551+
552+ expectTypeOf ( baz ) . not . toBeNumber ( )
532553 }
533554 )
534555
@@ -571,7 +592,8 @@ describe('type tests', () => {
571592 selector4 ( { } as State )
572593 // @ts -expect-error
573594 selector4 ( { } as State , 'blach' )
574- selector4 ( { } as State , 'blach' , 4 )
595+
596+ expectTypeOf ( selector4 ) . toBeCallableWith ( { } as State , 'blach' , 4 )
575597
576598 // as above but a unknown 2nd argument
577599 const selector5 = createSelector (
@@ -584,36 +606,19 @@ describe('type tests', () => {
584606 selector5 ( { } as State )
585607 // @ts -expect-error
586608 selector5 ( { } as State , 'blach' )
587- selector5 ( { } as State , 'blach' , 4 )
588-
589- // This next section is now obsolete with the changes in TS 4.9
590- // // @ts -expect-error It would be great to delete this, it is not correct.
591- // // Due to what must be a TS bug? if the default parameter is used, we lose the type for prefix
592- // // and it is impossible to type the selector without typing prefix
593- // const selector6 = createSelector(
594- // (state: State, prefix = '') => prefix + state.foo,
595- // (str: string) => str
596- // )
597-
598- // // because the suppressed error above, selector6 has broken typings and doesn't allow a passed parameter
599- // selector6({} as State)
600- // // @ts -expect-error would be great if we can delete this, it should not error
601- // selector6({} as State, 'blach')
602- // // @ts -expect-error wrong type
603- // selector6({} as State, 1)
609+
610+ expectTypeOf ( selector5 ) . toBeCallableWith ( { } as State , 'blach' , 4 )
604611
605612 // this is an example fixing selector6. We have to add a un-necessary typing in and magically the types are correct
606613 const selector7 = createSelector (
607- (
608- state : State ,
609- // eslint-disable-next-line @typescript-eslint/no-inferrable-types
610- prefix : string = 'a'
611- ) => prefix + state . foo ,
614+ ( state : State , prefix : string = 'a' ) => prefix + state . foo ,
612615 ( str : string ) => str
613616 )
614617
615- selector7 ( { } as State )
616- selector7 ( { } as State , 'blach' )
618+ expectTypeOf ( selector7 ) . toBeCallableWith ( { } as State )
619+
620+ expectTypeOf ( selector7 ) . toBeCallableWith ( { } as State , 'blach' )
621+
617622 // @ts -expect-error wrong type
618623 selector7 ( { } as State , 1 )
619624
@@ -624,9 +629,11 @@ describe('type tests', () => {
624629
625630 // @ts -expect-error needs a argument
626631 selector8 ( { } as State )
632+
627633 // allowed to pass anything as the type is unknown
628- selector8 ( { } as State , 'blach' )
629- selector8 ( { } as State , 2 )
634+ expectTypeOf ( selector8 ) . toBeCallableWith ( { } as State , 'blach' )
635+
636+ expectTypeOf ( selector8 ) . toBeCallableWith ( { } as State , 2 )
630637 } )
631638
632639 test ( 'dynamic array argument' , ( ) => {
0 commit comments