diff --git a/.changeset/tidy-states-infer.md b/.changeset/tidy-states-infer.md new file mode 100644 index 00000000000..c5f4d49e178 --- /dev/null +++ b/.changeset/tidy-states-infer.md @@ -0,0 +1,5 @@ +--- +'@tanstack/vue-query': patch +--- + +fix(vue-query/queryClient): infer the data and error types of 'getQueryState' from a tagged query key diff --git a/docs/framework/vue/reference/classes/QueryClient.md b/docs/framework/vue/reference/classes/QueryClient.md index ccf89cf8b00..fd7631bd7ed 100644 --- a/docs/framework/vue/reference/classes/QueryClient.md +++ b/docs/framework/vue/reference/classes/QueryClient.md @@ -3,7 +3,7 @@ id: QueryClient title: QueryClient --- -Defined in: [packages/vue-query/src/queryClient.ts:51](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L51) +Defined in: [packages/vue-query/src/queryClient.ts:52](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L52) Vue-aware subclass of `@tanstack/query-core`'s `QueryClient`. Methods that accept `options` (such as `CancelOptions` or `InvalidateOptions`) or filters (such as the `QueryFilters` accepted by @@ -30,7 +30,7 @@ Install one on your app with `VueQueryPlugin`, or retrieve it with `useQueryClie new QueryClient(config?: QueryClientConfig): QueryClient; ``` -Defined in: [packages/vue-query/src/queryClient.ts:52](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L52) +Defined in: [packages/vue-query/src/queryClient.ts:53](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L53) #### Parameters @@ -56,7 +56,7 @@ QC.constructor optional isRestoring?: Ref; ``` -Defined in: [packages/vue-query/src/queryClient.ts:65](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L65) +Defined in: [packages/vue-query/src/queryClient.ts:66](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L66) `true` while a `clientPersister` passed to `VueQueryPlugin` is restoring the cache. Queries don't fetch while this is `true`. Defaults to `false` if no persister is configured. @@ -69,7 +69,7 @@ while this is `true`. Defaults to `false` if no persister is configured. cancelQueries(filters?: QueryFilters, options?: MaybeRefDeep): Promise; ``` -Defined in: [packages/vue-query/src/queryClient.ts:196](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L196) +Defined in: [packages/vue-query/src/queryClient.ts:209](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L209) Cancels outgoing fetches for queries matching the given filters. Most useful when performing optimistic updates, since any outgoing refetch that resolves afterwards would otherwise @@ -323,7 +323,7 @@ QC.ensureInfiniteQueryData ensureQueryData(options: EnsureQueryDataOptions): Promise; ``` -Defined in: [packages/vue-query/src/queryClient.ts:93](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L93) +Defined in: [packages/vue-query/src/queryClient.ts:94](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L94) ##### Type Parameters @@ -369,7 +369,7 @@ QC.ensureQueryData ensureQueryData(options: MaybeRefDeep>): Promise; ``` -Defined in: [packages/vue-query/src/queryClient.ts:101](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L101) +Defined in: [packages/vue-query/src/queryClient.ts:102](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L102) ##### Type Parameters @@ -419,7 +419,7 @@ QC.ensureQueryData fetchInfiniteQuery(options: FetchInfiniteQueryOptions): Promise>; ``` -Defined in: [packages/vue-query/src/queryClient.ts:477](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L477) +Defined in: [packages/vue-query/src/queryClient.ts:490](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L490) ##### Type Parameters @@ -469,7 +469,7 @@ QC.fetchInfiniteQuery fetchInfiniteQuery(options: MaybeRefDeep>): Promise>; ``` -Defined in: [packages/vue-query/src/queryClient.ts:492](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L492) +Defined in: [packages/vue-query/src/queryClient.ts:505](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L505) ##### Type Parameters @@ -523,7 +523,7 @@ QC.fetchInfiniteQuery fetchQuery(options: FetchQueryOptions): Promise; ``` -Defined in: [packages/vue-query/src/queryClient.ts:324](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L324) +Defined in: [packages/vue-query/src/queryClient.ts:337](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L337) ##### Type Parameters @@ -575,7 +575,7 @@ fetchQuery(options: | (() => FetchQueryOptions)): Promise; ``` -Defined in: [packages/vue-query/src/queryClient.ts:339](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L339) +Defined in: [packages/vue-query/src/queryClient.ts:352](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L352) ##### Type Parameters @@ -696,7 +696,7 @@ QC.getMutationCache getMutationDefaults(mutationKey: MaybeRefDeep): MutationObserverOptions; ``` -Defined in: [packages/vue-query/src/queryClient.ts:627](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L627) +Defined in: [packages/vue-query/src/queryClient.ts:640](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L640) Returns the default options registered for mutations whose mutation key partially matches the given `mutationKey`, via [QueryClient#setMutationDefaults](#setmutationdefaults). If multiple registered @@ -737,7 +737,7 @@ QC.getMutationDefaults getQueriesData(filters: MaybeRefDeep>): [readonly unknown[], TData | undefined][]; ``` -Defined in: [packages/vue-query/src/queryClient.ts:125](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L125) +Defined in: [packages/vue-query/src/queryClient.ts:126](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L126) Imperative (non-reactive) way to retrieve the cached data of multiple queries at once. Only queries matching the given filters are returned; if none match, an empty array is @@ -831,7 +831,7 @@ getQueryData(queryKey: TTaggedQueryKey): | undefined; ``` -Defined in: [packages/vue-query/src/queryClient.ts:75](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L75) +Defined in: [packages/vue-query/src/queryClient.ts:76](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L76) Imperative (non-reactive) way to retrieve data for a QueryKey. Should only be used in callbacks or functions where reading the latest data is necessary, e.g. for optimistic updates. @@ -880,7 +880,7 @@ QC.getQueryData getQueryData(queryKey: MaybeRefDeep): TData | undefined; ``` -Defined in: [packages/vue-query/src/queryClient.ts:81](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L81) +Defined in: [packages/vue-query/src/queryClient.ts:82](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L82) ##### Type Parameters @@ -912,7 +912,7 @@ QC.getQueryData getQueryDefaults(queryKey: MaybeRefDeep): OmitKeyof, "queryKey">; ``` -Defined in: [packages/vue-query/src/queryClient.ts:604](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L604) +Defined in: [packages/vue-query/src/queryClient.ts:617](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L617) Returns the default options registered for queries whose query key partially matches the given `queryKey`, via [QueryClient#setQueryDefaults](#setquerydefaults). If multiple registered defaults @@ -949,50 +949,101 @@ QC.getQueryDefaults ### getQueryState() +#### Call Signature + ```ts -getQueryState(queryKey: MaybeRefDeep): - | QueryState +getQueryState(queryKey: TTaggedQueryKey): + | QueryState | undefined; ``` -Defined in: [packages/vue-query/src/queryClient.ts:172](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L172) +Defined in: [packages/vue-query/src/queryClient.ts:173](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L173) Imperative (non-reactive) way to retrieve an existing query's state. If the query does not exist, `undefined` is returned. -#### Type Parameters +##### Type Parameters -##### TData +###### TQueryFnData -`TData` = `unknown` +`TQueryFnData` = `unknown` -##### TError +###### TError `TError` = `Error` -#### Parameters +###### TTaggedQueryKey -##### queryKey +`TTaggedQueryKey` *extends* readonly `unknown`[] = readonly `unknown`[] -`MaybeRefDeep`\ +###### TInferredQueryFnData + +`TInferredQueryFnData` = [`InferDataFromTag`](../type-aliases/InferDataFromTag.md)\<`TQueryFnData`, `TTaggedQueryKey`\> + +###### TInferredError + +`TInferredError` = [`InferErrorFromTag`](../type-aliases/InferErrorFromTag.md)\<`TError`, `TTaggedQueryKey`\> + +##### Parameters + +###### queryKey + +`TTaggedQueryKey` The query key of the query to read. -#### Returns +##### Returns - \| [`QueryState`](../interfaces/QueryState.md)\<`TData`, `TError`\> + \| [`QueryState`](../interfaces/QueryState.md)\<`TInferredQueryFnData`, `TInferredError`\> \| `undefined` The query's state, or `undefined` if no query with this key exists. -#### Example +##### Example ```ts const state = queryClient.getQueryState(['posts']) console.log(state?.dataUpdatedAt) ``` -#### Overrides +##### Overrides + +```ts +QC.getQueryState +``` + +#### Call Signature + +```ts +getQueryState(queryKey: MaybeRefDeep): + | QueryState + | undefined; +``` + +Defined in: [packages/vue-query/src/queryClient.ts:182](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L182) + +##### Type Parameters + +###### TData + +`TData` = `unknown` + +###### TError + +`TError` = `Error` + +##### Parameters + +###### queryKey + +`MaybeRefDeep`\ + +##### Returns + + \| [`QueryState`](../interfaces/QueryState.md)\<`TData`, `TError`\> + \| `undefined` + +##### Overrides ```ts QC.getQueryState @@ -1008,7 +1059,7 @@ QC.getQueryState infiniteQuery(options: InfiniteQueryExecuteOptions): Promise[] ? InfiniteData : TData>; ``` -Defined in: [packages/vue-query/src/queryClient.ts:410](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L410) +Defined in: [packages/vue-query/src/queryClient.ts:423](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L423) Asynchronous method to fetch and cache an infinite query, resolving with an [InfiniteData](../interfaces/InfiniteData.md) object or throwing with the error. @@ -1081,7 +1132,7 @@ QC.infiniteQuery infiniteQuery(options: MaybeRefDeep>): Promise[] ? InfiniteData : TData>; ``` -Defined in: [packages/vue-query/src/queryClient.ts:429](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L429) +Defined in: [packages/vue-query/src/queryClient.ts:442](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L442) ##### Type Parameters @@ -1131,7 +1182,7 @@ invalidateQueries(filters?: | (() => InvalidateQueryFilters), options?: MaybeRefDeep): Promise; ``` -Defined in: [packages/vue-query/src/queryClient.ts:207](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L207) +Defined in: [packages/vue-query/src/queryClient.ts:220](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L220) Marks queries matching the given filters as invalidated. Unlike [QueryClient#removeQueries](#removequeries), invalidated queries stay in the cache. @@ -1190,7 +1241,7 @@ QC.invalidateQueries isFetching(filters?: MaybeRefDeep>): number; ``` -Defined in: [packages/vue-query/src/queryClient.ts:67](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L67) +Defined in: [packages/vue-query/src/queryClient.ts:68](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L68) Returns the number of queries in the cache that are currently fetching, optionally matching a set of filters. This includes background-fetching, loading new pages, and @@ -1233,7 +1284,7 @@ QC.isFetching isMutating(filters?: MaybeRefDeep>): number; ``` -Defined in: [packages/vue-query/src/queryClient.ts:71](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L71) +Defined in: [packages/vue-query/src/queryClient.ts:72](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L72) Returns the number of mutations in the cache that are currently pending, optionally matching a set of filters. @@ -1302,7 +1353,7 @@ QC.mount prefetchInfiniteQuery(options: FetchInfiniteQueryOptions): Promise; ``` -Defined in: [packages/vue-query/src/queryClient.ts:533](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L533) +Defined in: [packages/vue-query/src/queryClient.ts:546](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L546) ##### Type Parameters @@ -1352,7 +1403,7 @@ QC.prefetchInfiniteQuery prefetchInfiniteQuery(options: MaybeRefDeep>): Promise; ``` -Defined in: [packages/vue-query/src/queryClient.ts:548](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L548) +Defined in: [packages/vue-query/src/queryClient.ts:561](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L561) ##### Type Parameters @@ -1406,7 +1457,7 @@ QC.prefetchInfiniteQuery prefetchQuery(options: FetchQueryOptions): Promise; ``` -Defined in: [packages/vue-query/src/queryClient.ts:376](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L376) +Defined in: [packages/vue-query/src/queryClient.ts:389](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L389) ##### Type Parameters @@ -1452,7 +1503,7 @@ QC.prefetchQuery prefetchQuery(options: MaybeRefDeep>): Promise; ``` -Defined in: [packages/vue-query/src/queryClient.ts:384](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L384) +Defined in: [packages/vue-query/src/queryClient.ts:397](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L397) ##### Type Parameters @@ -1502,7 +1553,7 @@ QC.prefetchQuery query(options: QueryExecuteOptions): Promise; ``` -Defined in: [packages/vue-query/src/queryClient.ts:263](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L263) +Defined in: [packages/vue-query/src/queryClient.ts:276](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L276) Asynchronous method to fetch and cache a query, resolving with the data or throwing with the error. @@ -1589,7 +1640,7 @@ QC.query query(options: MaybeRefDeep>): Promise; ``` -Defined in: [packages/vue-query/src/queryClient.ts:280](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L280) +Defined in: [packages/vue-query/src/queryClient.ts:293](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L293) ##### Type Parameters @@ -1641,7 +1692,7 @@ QC.query refetchQueries(filters?: RefetchQueryFilters, options?: MaybeRefDeep): Promise; ``` -Defined in: [packages/vue-query/src/queryClient.ts:247](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L247) +Defined in: [packages/vue-query/src/queryClient.ts:260](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L260) Refetches queries matching the given filters, regardless of whether they are stale. Without filters, every query in the cache is refetched. Queries that are disabled, or static (only @@ -1700,7 +1751,7 @@ QC.refetchQueries removeQueries(filters?: QueryFilters): void; ``` -Defined in: [packages/vue-query/src/queryClient.ts:178](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L178) +Defined in: [packages/vue-query/src/queryClient.ts:191](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L191) Removes queries from the cache that match the given filters. Unlike [QueryClient#invalidateQueries](#invalidatequeries) or [QueryClient#refetchQueries](#refetchqueries), this removes @@ -1746,7 +1797,7 @@ QC.removeQueries resetQueries(filters?: QueryFilters, options?: MaybeRefDeep): Promise; ``` -Defined in: [packages/vue-query/src/queryClient.ts:185](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L185) +Defined in: [packages/vue-query/src/queryClient.ts:198](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L198) Resets queries matching the given filters back to their initial state (e.g. any `initialData`), notifying subscribers rather than removing them. Active queries among the @@ -1834,7 +1885,7 @@ QC.resumePausedMutations setDefaultOptions(options: MaybeRefDeep>): void; ``` -Defined in: [packages/vue-query/src/queryClient.ts:586](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L586) +Defined in: [packages/vue-query/src/queryClient.ts:599](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L599) Dynamically sets the default options for this client, overwriting any previously defined default options. @@ -1882,7 +1933,7 @@ QC.setDefaultOptions setMutationDefaults(mutationKey: MaybeRefDeep, options: MaybeRefDeep>): void; ``` -Defined in: [packages/vue-query/src/queryClient.ts:610](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L610) +Defined in: [packages/vue-query/src/queryClient.ts:623](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L623) Sets default options for mutations whose mutation key partially matches the given `mutationKey`. As with [QueryClient#setQueryDefaults](#setquerydefaults), the order of registration @@ -1951,7 +2002,7 @@ setQueriesData( options?: MaybeRefDeep): [readonly unknown[], TData | undefined][]; ``` -Defined in: [packages/vue-query/src/queryClient.ts:160](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L160) +Defined in: [packages/vue-query/src/queryClient.ts:161](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L161) Synchronous way to immediately update the cached data of multiple queries at once, using filters or partial query key matching. Only queries that already exist and match the given @@ -2019,7 +2070,7 @@ setQueryData( options?: MaybeRefDeep): NoInfer | undefined; ``` -Defined in: [packages/vue-query/src/queryClient.ts:131](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L131) +Defined in: [packages/vue-query/src/queryClient.ts:132](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L132) Synchronous way to immediately update a query's cached data. If the updater (or the value passed) resolves to `undefined`, the cache is left untouched and no query is created; @@ -2095,7 +2146,7 @@ setQueryData( options?: MaybeRefDeep): NoInfer | undefined; ``` -Defined in: [packages/vue-query/src/queryClient.ts:143](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L143) +Defined in: [packages/vue-query/src/queryClient.ts:144](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L144) ##### Type Parameters @@ -2139,7 +2190,7 @@ QC.setQueryData setQueryDefaults(queryKey: MaybeRefDeep, options: MaybeRefDeep, "queryKey">>): void; ``` -Defined in: [packages/vue-query/src/queryClient.ts:590](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L590) +Defined in: [packages/vue-query/src/queryClient.ts:603](https://github.com/TanStack/query/blob/main/packages/vue-query/src/queryClient.ts#L603) Sets default options for queries whose query key partially matches the given `queryKey`. diff --git a/packages/vue-query/src/__tests__/queryClient.test-d.ts b/packages/vue-query/src/__tests__/queryClient.test-d.ts index a973cabdd22..f9e84715633 100644 --- a/packages/vue-query/src/__tests__/queryClient.test-d.ts +++ b/packages/vue-query/src/__tests__/queryClient.test-d.ts @@ -1,7 +1,8 @@ import { assertType, describe, expectTypeOf, it } from 'vitest' +import { ref } from 'vue-demi' import { queryKey } from '@tanstack/query-test-utils' import { QueryClient } from '../queryClient' -import type { DataTag, InfiniteData } from '@tanstack/query-core' +import type { DataTag, InfiniteData, QueryState } from '@tanstack/query-core' describe('getQueryData', () => { it('should be typed if key is tagged', () => { @@ -36,6 +37,51 @@ describe('getQueryData', () => { }) }) +describe('getQueryState', () => { + it('should be typed if key is tagged', () => { + const key = ['key'] as DataTag, number> + const queryClient = new QueryClient() + const state = queryClient.getQueryState(key) + + expectTypeOf(state).toEqualTypeOf | undefined>() + }) + + it('should be typed including error if key is tagged', () => { + type CustomError = Error & { customError: string } + const key = ['key'] as DataTag, number, CustomError> + const queryClient = new QueryClient() + const state = queryClient.getQueryState(key) + + expectTypeOf(state).toEqualTypeOf< + QueryState | undefined + >() + }) + + it('should infer unknown if key is not tagged', () => { + const key = ['key'] as const + const queryClient = new QueryClient() + const state = queryClient.getQueryState(key) + + expectTypeOf(state).toEqualTypeOf | undefined>() + }) + + it('should infer passed generic if passed', () => { + const key = ['key'] as const + const queryClient = new QueryClient() + const state = queryClient.getQueryState(key) + + expectTypeOf(state).toEqualTypeOf | undefined>() + }) + + it('should accept a ref key', () => { + const key = ref(['key']) + const queryClient = new QueryClient() + const state = queryClient.getQueryState(key) + + expectTypeOf(state).toEqualTypeOf | undefined>() + }) +}) + describe('setQueryData', () => { it('should type updater if key is tagged', () => { const key = ['key'] as DataTag, number> diff --git a/packages/vue-query/src/__tests__/queryOptions.test-d.ts b/packages/vue-query/src/__tests__/queryOptions.test-d.ts index f4cfe44f4df..f472f71d344 100644 --- a/packages/vue-query/src/__tests__/queryOptions.test-d.ts +++ b/packages/vue-query/src/__tests__/queryOptions.test-d.ts @@ -118,6 +118,18 @@ describe('queryOptions', () => { expectTypeOf(data).toEqualTypeOf() }) + it('should return the proper type when passed to getQueryState', () => { + const key = queryKey() + const { queryKey: tagged } = queryOptions({ + queryKey: key, + queryFn: () => Promise.resolve(5), + }) + + const queryClient = new QueryClient() + const state = queryClient.getQueryState(tagged) + + expectTypeOf(state?.data).toEqualTypeOf() + }) it('should properly type updaterFn when passed to setQueryData', () => { const key = queryKey() const { queryKey: tagged } = queryOptions({ diff --git a/packages/vue-query/src/queryClient.ts b/packages/vue-query/src/queryClient.ts index 3c2fb4f70d6..0e998f5bb36 100644 --- a/packages/vue-query/src/queryClient.ts +++ b/packages/vue-query/src/queryClient.ts @@ -14,6 +14,7 @@ import type { FetchInfiniteQueryOptions, FetchQueryOptions, InferDataFromTag, + InferErrorFromTag, InfiniteData, InfiniteQueryExecuteOptions, InvalidateOptions, @@ -169,6 +170,18 @@ export class QueryClient extends QC { ) } + override getQueryState< + TQueryFnData = unknown, + TError = DefaultError, + TTaggedQueryKey extends QueryKey = QueryKey, + TInferredQueryFnData = InferDataFromTag, + TInferredError = InferErrorFromTag, + >( + queryKey: TTaggedQueryKey, + ): QueryState | undefined + override getQueryState( + queryKey: MaybeRefDeep, + ): QueryState | undefined override getQueryState( queryKey: MaybeRefDeep, ): QueryState | undefined {