diff --git a/packages/toolkit/src/query/core/apiState.ts b/packages/toolkit/src/query/core/apiState.ts index 9a3f6800f0..e86d5b72c8 100644 --- a/packages/toolkit/src/query/core/apiState.ts +++ b/packages/toolkit/src/query/core/apiState.ts @@ -6,7 +6,7 @@ import type { InfiniteQueryDefinition, MutationDefinition, PageParamFrom, - QueryArgFrom, + QueryArgFromAnyQuery, QueryDefinition, ResultTypeFrom, } from '../endpointDefinitions' @@ -190,7 +190,7 @@ type BaseQuerySubState< /** * The argument originally passed into the hook or `initiate` action call */ - originalArgs: QueryArgFrom + originalArgs: QueryArgFromAnyQuery /** * A unique ID associated with the request */ diff --git a/packages/toolkit/src/query/core/buildSelectors.ts b/packages/toolkit/src/query/core/buildSelectors.ts index 3daca29696..fbdc07f02d 100644 --- a/packages/toolkit/src/query/core/buildSelectors.ts +++ b/packages/toolkit/src/query/core/buildSelectors.ts @@ -6,6 +6,7 @@ import type { InfiniteQueryDefinition, MutationDefinition, QueryArgFrom, + QueryArgFromAnyQuery, QueryDefinition, ReducerPathFrom, TagDescription, @@ -29,7 +30,11 @@ import { QueryStatus, getRequestStatusFlags } from './apiState' import { getMutationCacheKey } from './buildSlice' import type { createSelector as _createSelector } from './rtkImports' import { createNextState } from './rtkImports' -import { getNextPageParam, getPreviousPageParam } from './buildThunks' +import { + type AllQueryKeys, + getNextPageParam, + getPreviousPageParam, +} from './buildThunks' export type SkipToken = typeof skipToken /** @@ -372,10 +377,12 @@ export function buildSelectors< ) } - function selectCachedArgsForQuery>( + function selectCachedArgsForQuery< + QueryName extends AllQueryKeys, + >( state: RootState, queryName: QueryName, - ): Array> { + ): Array> { return Object.values(selectQueries(state) as QueryState) .filter( ( diff --git a/packages/toolkit/src/query/core/module.ts b/packages/toolkit/src/query/core/module.ts index 7ccf49ade6..63a1e8479f 100644 --- a/packages/toolkit/src/query/core/module.ts +++ b/packages/toolkit/src/query/core/module.ts @@ -19,6 +19,7 @@ import type { InfiniteQueryDefinition, MutationDefinition, QueryArgFrom, + QueryArgFromAnyQuery, QueryDefinition, TagDescription, } from '../endpointDefinitions' @@ -389,10 +390,10 @@ export interface ApiModules< * * Can be used for mutations that want to do optimistic updates instead of invalidating a set of tags, but don't know exactly what they need to update. */ - selectCachedArgsForQuery: >( + selectCachedArgsForQuery: >( state: RootState, queryName: QueryName, - ) => Array> + ) => Array> } /** * Endpoints based on the input endpoints provided to `createApi`, containing `select` and `action matchers`. diff --git a/packages/toolkit/src/query/endpointDefinitions.ts b/packages/toolkit/src/query/endpointDefinitions.ts index d69b976d21..9765ccf30d 100644 --- a/packages/toolkit/src/query/endpointDefinitions.ts +++ b/packages/toolkit/src/query/endpointDefinitions.ts @@ -1059,6 +1059,15 @@ export type InfiniteQueryArgFrom< D extends BaseEndpointDefinition, > = D extends InfiniteQueryDefinition ? QA : never +export type QueryArgFromAnyQuery< + D extends BaseEndpointDefinition, +> = + D extends InfiniteQueryDefinition + ? InfiniteQueryArgFrom + : D extends QueryDefinition + ? QueryArgFrom + : never + export type ResultTypeFrom> = D extends BaseEndpointDefinition ? RT : unknown diff --git a/packages/toolkit/src/query/tests/buildSelector.test-d.ts b/packages/toolkit/src/query/tests/buildSelector.test-d.ts index 15bf0c6be2..2f117b661a 100644 --- a/packages/toolkit/src/query/tests/buildSelector.test-d.ts +++ b/packages/toolkit/src/query/tests/buildSelector.test-d.ts @@ -73,6 +73,21 @@ describe('type tests', () => { getTodos: build.query({ query: () => '/todos', }), + getInfiniteTodos: build.infiniteQuery({ + infiniteQueryOptions: { + initialPageParam: 0, + maxPages: 3, + getNextPageParam: ( + lastPage, + allPages, + lastPageParam, + allPageParams, + ) => lastPageParam + 1, + }, + query({ pageParam }) { + return `/todos?page=${pageParam}` + }, + }), }), }) @@ -86,5 +101,11 @@ describe('type tests', () => { expectTypeOf( exampleApi.util.selectCachedArgsForQuery(store.getState(), 'getTodos'), ).toEqualTypeOf() + expectTypeOf( + exampleApi.util.selectCachedArgsForQuery( + store.getState(), + 'getInfiniteTodos', + ), + ).toEqualTypeOf() }) })