Skip to content

Commit f580d4d

Browse files
Nick-LucasTkDodo
andauthored
fix(types): Remove predicate typing for query filters (TanStack#8958)
* Remove prdicate typing * Removing generics everywhere * Fix type errors --------- Co-authored-by: Dominik Dorfmeister <[email protected]>
1 parent 231d9b1 commit f580d4d

File tree

7 files changed

+56
-244
lines changed

7 files changed

+56
-244
lines changed

packages/query-core/src/__tests__/queryClient.test-d.tsx

+17-34
Original file line numberDiff line numberDiff line change
@@ -225,18 +225,13 @@ describe('fully typed usage', () => {
225225
}
226226
const mutationOptions: MutationOptions<TData, TError> = {}
227227

228-
const queryFilters: QueryFilters<
229-
TData,
230-
TError,
231-
TData,
232-
DataTag<QueryKey, TData, TError>
233-
> = {
228+
const queryFilters: QueryFilters<DataTag<QueryKey, TData, TError>> = {
234229
predicate(query) {
235230
expectTypeOf(query).toEqualTypeOf<
236-
Query<TData, TError, TData, DataTag<QueryKey, TData, TError>>
231+
Query<unknown, Error, unknown, ReadonlyArray<unknown>>
237232
>()
238-
expectTypeOf(query.state.data).toEqualTypeOf<TData | undefined>()
239-
expectTypeOf(query.state.error).toEqualTypeOf<TError | null>()
233+
expectTypeOf(query.state.data).toEqualTypeOf<unknown>()
234+
expectTypeOf(query.state.error).toEqualTypeOf<Error | null>()
240235
return false
241236
},
242237
}
@@ -267,7 +262,7 @@ describe('fully typed usage', () => {
267262

268263
const queriesData = queryClient.getQueriesData(queryFilters)
269264
expectTypeOf(queriesData).toEqualTypeOf<
270-
Array<[QueryKey, TData | undefined]>
265+
Array<[ReadonlyArray<unknown>, unknown]>
271266
>()
272267

273268
const queryData3 = queryClient.setQueryData(queryKey, { foo: '' })
@@ -286,11 +281,9 @@ describe('fully typed usage', () => {
286281
>[1]
287282

288283
expectTypeOf<SetQueriesDataUpdaterArg>().toEqualTypeOf<
289-
Updater<TData | undefined, TData | undefined>
290-
>()
291-
expectTypeOf(queriesData2).toEqualTypeOf<
292-
Array<[QueryKey, TData | undefined]>
284+
Updater<unknown, unknown>
293285
>()
286+
expectTypeOf(queriesData2).toEqualTypeOf<Array<[QueryKey, unknown]>>()
294287

295288
const queryState = queryClient.getQueryState(queryKey)
296289
expectTypeOf(queryState).toEqualTypeOf<
@@ -530,10 +523,8 @@ describe('invalidateQueries', () => {
530523
queryClient.invalidateQueries({
531524
queryKey,
532525
predicate: (query) => {
533-
expectTypeOf(query.state.data).toEqualTypeOf<number | undefined>()
534-
expectTypeOf(query.queryKey).toEqualTypeOf<
535-
DataTag<Array<string>, number>
536-
>()
526+
expectTypeOf(query.state.data).toEqualTypeOf<unknown>()
527+
expectTypeOf(query.queryKey).toEqualTypeOf<QueryKey>()
537528
return true
538529
},
539530
})
@@ -547,10 +538,8 @@ describe('cancelQueries', () => {
547538
queryClient.cancelQueries({
548539
queryKey,
549540
predicate: (query) => {
550-
expectTypeOf(query.state.data).toEqualTypeOf<number | undefined>()
551-
expectTypeOf(query.queryKey).toEqualTypeOf<
552-
DataTag<Array<string>, number>
553-
>()
541+
expectTypeOf(query.state.data).toEqualTypeOf<unknown>()
542+
expectTypeOf(query.queryKey).toEqualTypeOf<QueryKey>()
554543
return true
555544
},
556545
})
@@ -564,10 +553,8 @@ describe('removeQueries', () => {
564553
queryClient.removeQueries({
565554
queryKey,
566555
predicate: (query) => {
567-
expectTypeOf(query.state.data).toEqualTypeOf<number | undefined>()
568-
expectTypeOf(query.queryKey).toEqualTypeOf<
569-
DataTag<Array<string>, number>
570-
>()
556+
expectTypeOf(query.state.data).toEqualTypeOf<unknown>()
557+
expectTypeOf(query.queryKey).toEqualTypeOf<QueryKey>()
571558
return true
572559
},
573560
})
@@ -581,10 +568,8 @@ describe('refetchQueries', () => {
581568
queryClient.refetchQueries({
582569
queryKey,
583570
predicate: (query) => {
584-
expectTypeOf(query.state.data).toEqualTypeOf<number | undefined>()
585-
expectTypeOf(query.queryKey).toEqualTypeOf<
586-
DataTag<Array<string>, number>
587-
>()
571+
expectTypeOf(query.state.data).toEqualTypeOf<unknown>()
572+
expectTypeOf(query.queryKey).toEqualTypeOf<QueryKey>()
588573
return true
589574
},
590575
})
@@ -598,10 +583,8 @@ describe('resetQueries', () => {
598583
queryClient.resetQueries({
599584
queryKey,
600585
predicate: (query) => {
601-
expectTypeOf(query.state.data).toEqualTypeOf<number | undefined>()
602-
expectTypeOf(query.queryKey).toEqualTypeOf<
603-
DataTag<Array<string>, number>
604-
>()
586+
expectTypeOf(query.state.data).toEqualTypeOf<unknown>()
587+
expectTypeOf(query.queryKey).toEqualTypeOf<QueryKey>()
605588
return true
606589
},
607590
})

packages/query-core/src/__tests__/utils.test-d.tsx

+3-33
Original file line numberDiff line numberDiff line change
@@ -4,43 +4,13 @@ import type { QueryFilters } from '../utils'
44
import type { DataTag, QueryKey } from '../types'
55

66
describe('QueryFilters', () => {
7-
it('should be typed if generics are passed', () => {
8-
type TData = { a: number; b: string }
9-
10-
const filters: QueryFilters<
11-
TData,
12-
Error,
13-
TData,
14-
DataTag<QueryKey, TData>
15-
> = {
16-
predicate(query) {
17-
expectTypeOf(query.setData({ a: 1, b: '1' })).toEqualTypeOf<TData>()
18-
return true
19-
},
20-
queryKey: ['key'] as DataTag<undefined, TData>,
21-
}
22-
23-
const queryClient = new QueryClient()
24-
25-
const data = queryClient.getQueryData(filters.queryKey!)
26-
expectTypeOf(data).toEqualTypeOf<TData | undefined>()
27-
28-
const error = queryClient.getQueryState(filters.queryKey!)?.error
29-
expectTypeOf(error).toEqualTypeOf<Error | null | undefined>()
30-
})
31-
32-
it('should be typed if generics are passed including an error type', () => {
7+
it('should be typed unknown even if tagged generics are passed', () => {
338
type TData = { a: number; b: string }
349
type TError = Error & { message: string }
3510

36-
const filters: QueryFilters<
37-
TData,
38-
TError,
39-
TData,
40-
DataTag<QueryKey, TData, TError>
41-
> = {
11+
const filters: QueryFilters<DataTag<QueryKey, TData, TError>> = {
4212
predicate(query) {
43-
expectTypeOf(query.setData({ a: 1, b: '1' })).toEqualTypeOf<TData>()
13+
expectTypeOf(query.setData({ a: 1, b: '1' })).toEqualTypeOf<unknown>()
4414
return true
4515
},
4616
queryKey: ['key'] as DataTag<undefined, TData, TError>,

packages/query-core/src/queryCache.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ export class QueryCache extends Subscribable<QueryCacheListener> {
190190
) as Query<TQueryFnData, TError, TData> | undefined
191191
}
192192

193-
findAll(filters: QueryFilters<any, any, any, any> = {}): Array<Query> {
193+
findAll(filters: QueryFilters<any> = {}): Array<Query> {
194194
const queries = this.getAll()
195195
return Object.keys(filters).length > 0
196196
? queries.filter((query) => matchQuery(filters, query))

packages/query-core/src/queryClient.ts

+21-104
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,9 @@ export class QueryClient {
106106
this.#unsubscribeOnline = undefined
107107
}
108108

109-
isFetching<
110-
TQueryFilters extends QueryFilters<any, any, any, any> = QueryFilters,
111-
>(filters?: TQueryFilters): number {
109+
isFetching<TQueryFilters extends QueryFilters<any> = QueryFilters>(
110+
filters?: TQueryFilters,
111+
): number {
112112
return this.#queryCache.findAll({ ...filters, fetchStatus: 'fetching' })
113113
.length
114114
}
@@ -166,25 +166,10 @@ export class QueryClient {
166166

167167
getQueriesData<
168168
TQueryFnData = unknown,
169-
TQueryFilters extends QueryFilters<
170-
any,
171-
any,
172-
any,
173-
any
174-
> = QueryFilters<TQueryFnData>,
175-
TInferredQueryFnData = TQueryFilters extends QueryFilters<
176-
infer TData,
177-
any,
178-
any,
179-
any
180-
>
181-
? TData
182-
: TQueryFnData,
183-
>(
184-
filters: TQueryFilters,
185-
): Array<[QueryKey, TInferredQueryFnData | undefined]> {
169+
TQueryFilters extends QueryFilters<any> = QueryFilters,
170+
>(filters: TQueryFilters): Array<[QueryKey, TQueryFnData | undefined]> {
186171
return this.#queryCache.findAll(filters).map(({ queryKey, state }) => {
187-
const data = state.data as TInferredQueryFnData | undefined
172+
const data = state.data as TQueryFnData | undefined
188173
return [queryKey, data]
189174
})
190175
}
@@ -226,34 +211,21 @@ export class QueryClient {
226211

227212
setQueriesData<
228213
TQueryFnData,
229-
TQueryFilters extends QueryFilters<
230-
any,
231-
any,
232-
any,
233-
any
234-
> = QueryFilters<TQueryFnData>,
235-
TInferredQueryFnData = TQueryFilters extends QueryFilters<
236-
infer TData,
237-
any,
238-
any,
239-
any
240-
>
241-
? TData
242-
: TQueryFnData,
214+
TQueryFilters extends QueryFilters<any> = QueryFilters,
243215
>(
244216
filters: TQueryFilters,
245217
updater: Updater<
246-
NoInfer<TInferredQueryFnData> | undefined,
247-
NoInfer<TInferredQueryFnData> | undefined
218+
NoInfer<TQueryFnData> | undefined,
219+
NoInfer<TQueryFnData> | undefined
248220
>,
249221
options?: SetDataOptions,
250-
): Array<[QueryKey, TInferredQueryFnData | undefined]> {
222+
): Array<[QueryKey, TQueryFnData | undefined]> {
251223
return notifyManager.batch(() =>
252224
this.#queryCache
253225
.findAll(filters)
254226
.map(({ queryKey }) => [
255227
queryKey,
256-
this.setQueryData<TInferredQueryFnData>(queryKey, updater, options),
228+
this.setQueryData<TQueryFnData>(queryKey, updater, options),
257229
]),
258230
)
259231
}
@@ -273,19 +245,8 @@ export class QueryClient {
273245
)?.state
274246
}
275247

276-
removeQueries<
277-
TQueryFnData = unknown,
278-
TError = DefaultError,
279-
TTaggedQueryKey extends QueryKey = QueryKey,
280-
TInferredQueryFnData = InferDataFromTag<TQueryFnData, TTaggedQueryKey>,
281-
TInferredError = InferErrorFromTag<TError, TTaggedQueryKey>,
282-
>(
283-
filters?: QueryFilters<
284-
TInferredQueryFnData,
285-
TInferredError,
286-
TInferredQueryFnData,
287-
TTaggedQueryKey
288-
>,
248+
removeQueries<TTaggedQueryKey extends QueryKey = QueryKey>(
249+
filters?: QueryFilters<TTaggedQueryKey>,
289250
): void {
290251
const queryCache = this.#queryCache
291252
notifyManager.batch(() => {
@@ -295,19 +256,8 @@ export class QueryClient {
295256
})
296257
}
297258

298-
resetQueries<
299-
TQueryFnData = unknown,
300-
TError = DefaultError,
301-
TTaggedQueryKey extends QueryKey = QueryKey,
302-
TInferredQueryFnData = InferDataFromTag<TQueryFnData, TTaggedQueryKey>,
303-
TInferredError = InferErrorFromTag<TError, TTaggedQueryKey>,
304-
>(
305-
filters?: QueryFilters<
306-
TInferredQueryFnData,
307-
TInferredError,
308-
TInferredQueryFnData,
309-
TTaggedQueryKey
310-
>,
259+
resetQueries<TTaggedQueryKey extends QueryKey = QueryKey>(
260+
filters?: QueryFilters<TTaggedQueryKey>,
311261
options?: ResetOptions,
312262
): Promise<void> {
313263
const queryCache = this.#queryCache
@@ -326,19 +276,8 @@ export class QueryClient {
326276
})
327277
}
328278

329-
cancelQueries<
330-
TQueryFnData = unknown,
331-
TError = DefaultError,
332-
TTaggedQueryKey extends QueryKey = QueryKey,
333-
TInferredQueryFnData = InferDataFromTag<TQueryFnData, TTaggedQueryKey>,
334-
TInferredError = InferErrorFromTag<TError, TTaggedQueryKey>,
335-
>(
336-
filters?: QueryFilters<
337-
TInferredQueryFnData,
338-
TInferredError,
339-
TInferredQueryFnData,
340-
TTaggedQueryKey
341-
>,
279+
cancelQueries<TTaggedQueryKey extends QueryKey = QueryKey>(
280+
filters?: QueryFilters<TTaggedQueryKey>,
342281
cancelOptions: CancelOptions = {},
343282
): Promise<void> {
344283
const defaultedCancelOptions = { revert: true, ...cancelOptions }
@@ -352,19 +291,8 @@ export class QueryClient {
352291
return Promise.all(promises).then(noop).catch(noop)
353292
}
354293

355-
invalidateQueries<
356-
TQueryFnData = unknown,
357-
TError = DefaultError,
358-
TTaggedQueryKey extends QueryKey = QueryKey,
359-
TInferredQueryFnData = InferDataFromTag<TQueryFnData, TTaggedQueryKey>,
360-
TInferredError = InferErrorFromTag<TError, TTaggedQueryKey>,
361-
>(
362-
filters?: InvalidateQueryFilters<
363-
TInferredQueryFnData,
364-
TInferredError,
365-
TInferredQueryFnData,
366-
TTaggedQueryKey
367-
>,
294+
invalidateQueries<TTaggedQueryKey extends QueryKey = QueryKey>(
295+
filters?: InvalidateQueryFilters<TTaggedQueryKey>,
368296
options: InvalidateOptions = {},
369297
): Promise<void> {
370298
return notifyManager.batch(() => {
@@ -385,19 +313,8 @@ export class QueryClient {
385313
})
386314
}
387315

388-
refetchQueries<
389-
TQueryFnData = unknown,
390-
TError = DefaultError,
391-
TTaggedQueryKey extends QueryKey = QueryKey,
392-
TInferredQueryFnData = InferDataFromTag<TQueryFnData, TTaggedQueryKey>,
393-
TInferredError = InferErrorFromTag<TError, TTaggedQueryKey>,
394-
>(
395-
filters?: RefetchQueryFilters<
396-
TInferredQueryFnData,
397-
TInferredError,
398-
TInferredQueryFnData,
399-
TTaggedQueryKey
400-
>,
316+
refetchQueries<TTaggedQueryKey extends QueryKey = QueryKey>(
317+
filters?: RefetchQueryFilters<TTaggedQueryKey>,
401318
options: RefetchOptions = {},
402319
): Promise<void> {
403320
const fetchOptions = {

packages/query-core/src/types.ts

+4-12
Original file line numberDiff line numberDiff line change
@@ -576,21 +576,13 @@ export interface RefetchOptions extends ResultOptions {
576576
cancelRefetch?: boolean
577577
}
578578

579-
export interface InvalidateQueryFilters<
580-
TQueryFnData = unknown,
581-
TError = DefaultError,
582-
TData = TQueryFnData,
583-
TQueryKey extends QueryKey = QueryKey,
584-
> extends QueryFilters<TQueryFnData, TError, TData, TQueryKey> {
579+
export interface InvalidateQueryFilters<TQueryKey extends QueryKey = QueryKey>
580+
extends QueryFilters<TQueryKey> {
585581
refetchType?: QueryTypeFilter | 'none'
586582
}
587583

588-
export interface RefetchQueryFilters<
589-
TQueryFnData = unknown,
590-
TError = DefaultError,
591-
TData = TQueryFnData,
592-
TQueryKey extends QueryKey = QueryKey,
593-
> extends QueryFilters<TQueryFnData, TError, TData, TQueryKey> {}
584+
export interface RefetchQueryFilters<TQueryKey extends QueryKey = QueryKey>
585+
extends QueryFilters<TQueryKey> {}
594586

595587
export interface InvalidateOptions extends RefetchOptions {}
596588
export interface ResetOptions extends RefetchOptions {}

0 commit comments

Comments
 (0)