@@ -48,7 +48,7 @@ const api = createApi({
4848 }
4949 } ,
5050 endpoints : ( build ) => ( {
51- getUser : build . query < any , number > ( {
51+ getUser : build . query < { name : string } , number > ( {
5252 query : ( arg ) => arg ,
5353 } ) ,
5454 getIncrementedAmount : build . query < any , void > ( {
@@ -774,6 +774,82 @@ describe('hooks tests', () => {
774774 . actions . filter ( api . internalActions . unsubscribeQueryResult . match )
775775 ) . toHaveLength ( 4 )
776776 } )
777+
778+ test ( 'useLazyQuery hook callback returns various properties to handle the result' , async ( ) => {
779+ function User ( ) {
780+ const [ getUser ] = api . endpoints . getUser . useLazyQuery ( )
781+ const [ successMsg , setSuccessMsg ] = React . useState ( '' )
782+ const [ errMsg , setErrMsg ] = React . useState ( '' )
783+ const [ isAborted , setIsAborted ] = React . useState ( false )
784+
785+ const handleClick = async ( ) => {
786+ const res = getUser ( 1 )
787+
788+ // no-op simply for clearer type assertions
789+ res . then ( ( result ) => {
790+ expectExactType <
791+ | {
792+ error : { status : number ; data : unknown } | SerializedError
793+ }
794+ | {
795+ data : undefined
796+ }
797+ | {
798+ data : {
799+ name : string
800+ }
801+ }
802+ > ( result )
803+ } )
804+
805+ expectType < number > ( res . arg )
806+ expectType < string > ( res . requestId )
807+ expectType < ( ) => void > ( res . abort )
808+ expectType < ( ) => Promise < { name : string } > > ( res . unwrap )
809+ expectType < ( ) => void > ( res . unsubscribe )
810+ expectType < ( options : SubscriptionOptions ) => void > (
811+ res . updateSubscriptionOptions
812+ )
813+ expectType < ( ) => void > ( res . refetch )
814+
815+ // abort the query immediately to force an error
816+ res . abort ( )
817+ res
818+ . unwrap ( )
819+ . then ( ( result ) => {
820+ expectType < { name : string } > ( result )
821+ setSuccessMsg ( `Successfully fetched user ${ result . name } ` )
822+ } )
823+ . catch ( ( err ) => {
824+ setErrMsg ( `An error has occurred fetching userId: ${ res . arg } ` )
825+ if ( err . name === 'AbortError' ) {
826+ setIsAborted ( true )
827+ }
828+ } )
829+ }
830+
831+ return (
832+ < div >
833+ < button onClick = { handleClick } > Fetch User and abort</ button >
834+ < div > { successMsg } </ div >
835+ < div > { errMsg } </ div >
836+ < div > { isAborted ? 'Request was aborted' : '' } </ div >
837+ </ div >
838+ )
839+ }
840+
841+ render ( < User /> , { wrapper : storeRef . wrapper } )
842+ expect ( screen . queryByText ( / A n e r r o r h a s o c c u r r e d / i) ) . toBeNull ( )
843+ expect ( screen . queryByText ( / S u c c e s s f u l l y f e t c h e d u s e r / i) ) . toBeNull ( )
844+ expect ( screen . queryByText ( 'Request was aborted' ) ) . toBeNull ( )
845+
846+ fireEvent . click (
847+ screen . getByRole ( 'button' , { name : 'Fetch User and abort' } )
848+ )
849+ await screen . findByText ( 'An error has occurred fetching userId: 1' )
850+ expect ( screen . queryByText ( / S u c c e s s f u l l y f e t c h e d u s e r / i) ) . toBeNull ( )
851+ screen . getByText ( 'Request was aborted' )
852+ } )
777853 } )
778854
779855 describe ( 'useMutation' , ( ) => {
0 commit comments