diff --git a/packages/toolkit/src/query/react/buildHooks.ts b/packages/toolkit/src/query/react/buildHooks.ts index d956bb1a91..0cf36d673d 100644 --- a/packages/toolkit/src/query/react/buildHooks.ts +++ b/packages/toolkit/src/query/react/buildHooks.ts @@ -306,6 +306,12 @@ export type UseQueryStateResult< type UseQueryStateBaseResult> = QuerySubState & { + /** + * Where `data` tries to hold data as much as possible, also re-using + * data from the last arguments passed into the hook, this property + * will always contain the received data from the query, for the current query arguments. + */ + currentData?: ResultTypeFrom /** * Query has not started yet. */ @@ -342,11 +348,21 @@ type UseQueryStateDefaultResult> = | { isLoading: true; isFetching: boolean; data: undefined } | ({ isSuccess: true - isFetching: boolean + isFetching: true error: undefined } & Required< Pick, 'data' | 'fulfilledTimeStamp'> >) + | ({ + isSuccess: true + isFetching: false + error: undefined + } & Required< + Pick< + UseQueryStateBaseResult, + 'data' | 'fulfilledTimeStamp' | 'currentData' + > + >) | ({ isError: true } & Required< Pick, 'error'> >) @@ -420,6 +436,7 @@ const queryStatePreSelector = ( return { ...currentState, data, + currentData: currentState.data, isFetching, isLoading, isSuccess, diff --git a/packages/toolkit/src/query/tests/unionTypes.test.ts b/packages/toolkit/src/query/tests/unionTypes.test.ts index 87616715e7..0a7e421a9f 100644 --- a/packages/toolkit/src/query/tests/unionTypes.test.ts +++ b/packages/toolkit/src/query/tests/unionTypes.test.ts @@ -115,6 +115,20 @@ describe.skip('TS only tests', () => { expectExactType(false as false)(result.isError) } + expectExactType('' as string | undefined)(result.currentData) + // @ts-expect-error + expectExactType('' as string)(result.currentData) + + if (result.isSuccess) { + if (!result.isFetching) { + expectExactType('' as string)(result.currentData) + } else { + expectExactType('' as string | undefined)(result.currentData) + // @ts-expect-error + expectExactType('' as string)(result.currentData) + } + } + // @ts-expect-error expectType(result) // is always one of those four