Skip to content

Commit 422c879

Browse files
Nick-LucasTkDodoautofix-ci[bot]
authored
fix(types): Add types for QueryFilters which flow down to Query<> and QueryKey/DataTag types (#8332)
* Add types for QueryFilters which flow down to Query<> and QueryKey/DataTag types * ci: apply automated fixes * Add a type test * ci: apply automated fixes * Fix linting --------- Co-authored-by: Dominik Dorfmeister <[email protected]> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
1 parent d28de3c commit 422c879

File tree

3 files changed

+68
-5
lines changed

3 files changed

+68
-5
lines changed
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import { describe, expectTypeOf, it } from 'vitest'
2+
import { QueryClient } from '../queryClient'
3+
import type { QueryFilters } from '../utils'
4+
import type { DataTag } from '../types'
5+
6+
describe('QueryFilters', () => {
7+
it('should be typed if generics are passed', () => {
8+
type TData = { a: number; b: string }
9+
type TError = { message: string }
10+
11+
const a: QueryFilters<TData, TError> = {
12+
predicate(query) {
13+
expectTypeOf(query.setData({ a: 1, b: '1' })).toEqualTypeOf<TData>()
14+
return true
15+
},
16+
queryKey: ['key'] as DataTag<undefined, TData>,
17+
}
18+
19+
const queryClient = new QueryClient()
20+
21+
const data = queryClient.getQueryData(a.queryKey!)
22+
expectTypeOf(data).toEqualTypeOf<TData | undefined>()
23+
24+
const error = queryClient.getQueryState(a.queryKey!)?.error
25+
expectTypeOf(error).toEqualTypeOf<Error | null | undefined>() // maybe one day this can return TError
26+
})
27+
28+
it('should be loose typed if generics are defaults', () => {
29+
const a: QueryFilters = {
30+
predicate(query) {
31+
expectTypeOf(query.setData({ a: 1, b: '1' })).toEqualTypeOf<unknown>()
32+
return true
33+
},
34+
queryKey: ['key'],
35+
}
36+
37+
const queryClient = new QueryClient()
38+
39+
const data = queryClient.getQueryData(a.queryKey!)
40+
expectTypeOf(data).toEqualTypeOf<unknown>()
41+
42+
const error = queryClient.getQueryState(a.queryKey!)?.error
43+
expectTypeOf(error).toEqualTypeOf<Error | null | undefined>()
44+
})
45+
})

packages/query-core/src/types.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -534,11 +534,21 @@ export interface RefetchOptions extends ResultOptions {
534534
cancelRefetch?: boolean
535535
}
536536

537-
export interface InvalidateQueryFilters extends QueryFilters {
537+
export interface InvalidateQueryFilters<
538+
TQueryFnData = unknown,
539+
TError = Error,
540+
TData = TQueryFnData,
541+
TQueryKey extends QueryKey = QueryKey,
542+
> extends QueryFilters<TQueryFnData, TError, TData, TQueryKey> {
538543
refetchType?: QueryTypeFilter | 'none'
539544
}
540545

541-
export interface RefetchQueryFilters extends QueryFilters {}
546+
export interface RefetchQueryFilters<
547+
TQueryFnData = unknown,
548+
TError = Error,
549+
TData = TQueryFnData,
550+
TQueryKey extends QueryKey = QueryKey,
551+
> extends QueryFilters<TQueryFnData, TError, TData, TQueryKey> {}
542552

543553
export interface InvalidateOptions extends RefetchOptions {}
544554
export interface ResetOptions extends RefetchOptions {}

packages/query-core/src/utils.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type {
2+
DataTag,
23
DefaultError,
34
Enabled,
45
FetchStatus,
@@ -14,7 +15,12 @@ import type { FetchOptions, Query } from './query'
1415

1516
// TYPES
1617

17-
export interface QueryFilters {
18+
export interface QueryFilters<
19+
TQueryFnData = unknown,
20+
TError = Error,
21+
TData = TQueryFnData,
22+
TQueryKey extends QueryKey = QueryKey,
23+
> {
1824
/**
1925
* Filter to active queries, inactive queries or all queries
2026
*/
@@ -26,11 +32,13 @@ export interface QueryFilters {
2632
/**
2733
* Include queries matching this predicate function
2834
*/
29-
predicate?: (query: Query) => boolean
35+
predicate?: (query: Query<TQueryFnData, TError, TData, TQueryKey>) => boolean
3036
/**
3137
* Include queries matching this query key
3238
*/
33-
queryKey?: QueryKey
39+
queryKey?: unknown extends TQueryFnData
40+
? QueryKey
41+
: QueryKey & DataTag<unknown, TQueryFnData>
3442
/**
3543
* Include or exclude stale queries
3644
*/

0 commit comments

Comments
 (0)