Skip to content

Commit db92891

Browse files
committed
fix(vue-query): expose queryFn and other properties on queryOptions return type
The return type of queryOptions was using types wrapped in MaybeRef, which prevented TypeScript from seeing properties like queryFn directly on the returned object. This creates new unwrapped types (DefinedInitialDataOptions and UndefinedInitialDataOptions) specifically for queryOptions return types, matching the approach used in react-query. Fixes #7892 Signed-off-by: Vedant Madane <6527493+VedantMadane@users.noreply.github.com>
1 parent d688458 commit db92891

File tree

2 files changed

+72
-8
lines changed

2 files changed

+72
-8
lines changed

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,21 @@ import { queryOptions } from '../queryOptions'
66
import { useQuery } from '../useQuery'
77

88
describe('queryOptions', () => {
9+
it('should expose queryFn and other properties on the returned options object', () => {
10+
const options = queryOptions({
11+
queryKey: ['key'],
12+
queryFn: () => Promise.resolve(5),
13+
staleTime: 1000,
14+
})
15+
16+
// These should be accessible without TS errors (issue #7892)
17+
expectTypeOf(options.queryFn).toEqualTypeOf<
18+
(() => Promise<number>) | undefined
19+
>()
20+
expectTypeOf(options.staleTime).toEqualTypeOf<number | undefined>()
21+
expectTypeOf(options.queryKey).toMatchTypeOf<readonly unknown[]>()
22+
})
23+
924
it('should not allow excess properties', () => {
1025
assertType(
1126
queryOptions({

packages/vue-query/src/queryOptions.ts

Lines changed: 57 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,66 @@
1-
import type { DataTag, DefaultError, QueryKey } from '@tanstack/query-core'
21
import type {
3-
DefinedInitialQueryOptions,
4-
UndefinedInitialQueryOptions,
5-
} from './useQuery'
2+
DataTag,
3+
DefaultError,
4+
InitialDataFunction,
5+
NonUndefinedGuard,
6+
QueryKey,
7+
QueryObserverOptions,
8+
} from '@tanstack/query-core'
9+
import type { DeepUnwrapRef, ShallowOption } from './types'
10+
11+
/**
12+
* Options for queryOptions with defined initial data.
13+
* These are unwrapped types (not MaybeRef) so that properties like queryFn are directly accessible.
14+
*/
15+
export type DefinedInitialDataOptions<
16+
TQueryFnData = unknown,
17+
TError = DefaultError,
18+
TData = TQueryFnData,
19+
TQueryKey extends QueryKey = QueryKey,
20+
> = QueryObserverOptions<
21+
TQueryFnData,
22+
TError,
23+
TData,
24+
TQueryFnData,
25+
DeepUnwrapRef<TQueryKey>
26+
> &
27+
ShallowOption & {
28+
initialData:
29+
| NonUndefinedGuard<TQueryFnData>
30+
| (() => NonUndefinedGuard<TQueryFnData>)
31+
}
32+
33+
/**
34+
* Options for queryOptions with undefined initial data.
35+
* These are unwrapped types (not MaybeRef) so that properties like queryFn are directly accessible.
36+
*/
37+
export type UndefinedInitialDataOptions<
38+
TQueryFnData = unknown,
39+
TError = DefaultError,
40+
TData = TQueryFnData,
41+
TQueryKey extends QueryKey = QueryKey,
42+
> = QueryObserverOptions<
43+
TQueryFnData,
44+
TError,
45+
TData,
46+
TQueryFnData,
47+
DeepUnwrapRef<TQueryKey>
48+
> &
49+
ShallowOption & {
50+
initialData?:
51+
| undefined
52+
| InitialDataFunction<NonUndefinedGuard<TQueryFnData>>
53+
| NonUndefinedGuard<TQueryFnData>
54+
}
655

756
export function queryOptions<
857
TQueryFnData = unknown,
958
TError = DefaultError,
1059
TData = TQueryFnData,
1160
TQueryKey extends QueryKey = QueryKey,
1261
>(
13-
options: DefinedInitialQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
14-
): DefinedInitialQueryOptions<TQueryFnData, TError, TData, TQueryKey> & {
62+
options: DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,
63+
): DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey> & {
1564
queryKey: DataTag<TQueryKey, TQueryFnData, TError>
1665
}
1766

@@ -21,8 +70,8 @@ export function queryOptions<
2170
TData = TQueryFnData,
2271
TQueryKey extends QueryKey = QueryKey,
2372
>(
24-
options: UndefinedInitialQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
25-
): UndefinedInitialQueryOptions<TQueryFnData, TError, TData, TQueryKey> & {
73+
options: UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,
74+
): UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey> & {
2675
queryKey: DataTag<TQueryKey, TQueryFnData, TError>
2776
}
2877

0 commit comments

Comments
 (0)