Skip to content

Commit c5de051

Browse files
authored
fix(vue-query/queryClient): infer the data and error types of 'getQueryState' from a tagged query key (#11921)
* fix(vue-query/queryClient): infer the data and error types of 'getQueryState' from a tagged query key * docs(vue-query): regenerate reference docs for 'getQueryState' overloads
1 parent 0ab7c5f commit c5de051

4 files changed

Lines changed: 78 additions & 1 deletion

File tree

‎.changeset/tidy-states-infer.md‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@tanstack/vue-query': patch
3+
---
4+
5+
fix(vue-query/queryClient): infer the data and error types of 'getQueryState' from a tagged query key

‎packages/vue-query/src/__tests__/queryClient.test-d.ts‎

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import { assertType, describe, expectTypeOf, it } from 'vitest'
2+
import { ref } from 'vue-demi'
23
import { createKey } from '@tanstack/query-test-utils'
34
import { QueryClient } from '../queryClient'
4-
import type { DataTag, InfiniteData } from '@tanstack/query-core'
5+
import type { DataTag, InfiniteData, QueryState } from '@tanstack/query-core'
56

67
describe('getQueryData', () => {
78
it('should be typed if key is tagged', () => {
@@ -36,6 +37,51 @@ describe('getQueryData', () => {
3637
})
3738
})
3839

40+
describe('getQueryState', () => {
41+
it('should be typed if key is tagged', () => {
42+
const key = ['key'] as DataTag<Array<string>, number>
43+
const queryClient = new QueryClient()
44+
const state = queryClient.getQueryState(key)
45+
46+
expectTypeOf(state).toEqualTypeOf<QueryState<number, Error> | undefined>()
47+
})
48+
49+
it('should be typed including error if key is tagged', () => {
50+
type CustomError = Error & { customError: string }
51+
const key = ['key'] as DataTag<Array<string>, number, CustomError>
52+
const queryClient = new QueryClient()
53+
const state = queryClient.getQueryState(key)
54+
55+
expectTypeOf(state).toEqualTypeOf<
56+
QueryState<number, CustomError> | undefined
57+
>()
58+
})
59+
60+
it('should infer unknown if key is not tagged', () => {
61+
const key = ['key'] as const
62+
const queryClient = new QueryClient()
63+
const state = queryClient.getQueryState(key)
64+
65+
expectTypeOf(state).toEqualTypeOf<QueryState<unknown, Error> | undefined>()
66+
})
67+
68+
it('should infer passed generic if passed', () => {
69+
const key = ['key'] as const
70+
const queryClient = new QueryClient()
71+
const state = queryClient.getQueryState<number>(key)
72+
73+
expectTypeOf(state).toEqualTypeOf<QueryState<number, Error> | undefined>()
74+
})
75+
76+
it('should accept a ref key', () => {
77+
const key = ref(['key'])
78+
const queryClient = new QueryClient()
79+
const state = queryClient.getQueryState<number>(key)
80+
81+
expectTypeOf(state).toEqualTypeOf<QueryState<number, Error> | undefined>()
82+
})
83+
})
84+
3985
describe('setQueryData', () => {
4086
it('should type updater if key is tagged', () => {
4187
const key = ['key'] as DataTag<Array<string>, number>

‎packages/vue-query/src/__tests__/queryOptions.test-d.ts‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,19 @@ describe('queryOptions', () => {
128128
expectTypeOf(data).toEqualTypeOf<number | undefined>()
129129
})
130130

131+
it('should return the proper type when passed to getQueryState', () => {
132+
const key = createKey()
133+
const { queryKey: tagged } = queryOptions({
134+
queryKey: key,
135+
queryFn: () => Promise.resolve(5),
136+
})
137+
138+
const queryClient = new QueryClient()
139+
const state = queryClient.getQueryState(tagged)
140+
141+
expectTypeOf(state?.data).toEqualTypeOf<number | undefined>()
142+
})
143+
131144
it('should properly type updaterFn when passed to setQueryData', () => {
132145
const key = createKey()
133146
const { queryKey: tagged } = queryOptions({

‎packages/vue-query/src/queryClient.ts‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import type {
1414
FetchInfiniteQueryOptions,
1515
FetchQueryOptions,
1616
InferDataFromTag,
17+
InferErrorFromTag,
1718
InfiniteData,
1819
InfiniteQueryExecuteOptions,
1920
InvalidateOptions,
@@ -181,6 +182,18 @@ export class QueryClient extends QC {
181182
)
182183
}
183184

185+
override getQueryState<
186+
TQueryFnData = unknown,
187+
TError = DefaultError,
188+
TTaggedQueryKey extends QueryKey = QueryKey,
189+
TInferredQueryFnData = InferDataFromTag<TQueryFnData, TTaggedQueryKey>,
190+
TInferredError = InferErrorFromTag<TError, TTaggedQueryKey>,
191+
>(
192+
queryKey: TTaggedQueryKey,
193+
): QueryState<TInferredQueryFnData, TInferredError> | undefined
194+
override getQueryState<TData = unknown, TError = DefaultError>(
195+
queryKey: MaybeRefDeep<QueryKey>,
196+
): QueryState<TData, TError> | undefined
184197
override getQueryState<TData = unknown, TError = DefaultError>(
185198
queryKey: MaybeRefDeep<QueryKey>,
186199
): QueryState<TData, TError> | undefined {

0 commit comments

Comments
 (0)