@@ -2,34 +2,55 @@ import type {
22 DataTag ,
33 DefaultError ,
44 InitialDataFunction ,
5+ OmitKeyof ,
6+ QueryFunction ,
57 QueryKey ,
8+ SkipToken ,
69} from '@tanstack/query-core'
7- import type { CreateQueryOptions , NonUndefinedGuard } from './types'
10+ import type { CreateQueryOptions } from './types'
811
9- /**
10- * @public
11- */
1212export type UndefinedInitialDataOptions <
1313 TQueryFnData = unknown ,
1414 TError = DefaultError ,
1515 TData = TQueryFnData ,
1616 TQueryKey extends QueryKey = QueryKey ,
1717> = CreateQueryOptions < TQueryFnData , TError , TData , TQueryKey > & {
18- initialData ?: undefined | InitialDataFunction < NonUndefinedGuard < TQueryFnData > >
18+ initialData ?:
19+ | undefined
20+ | InitialDataFunction < NonUndefinedGuard < TQueryFnData > >
21+ | NonUndefinedGuard < TQueryFnData >
1922}
2023
21- /**
22- * @public
23- */
24+ export type UnusedSkipTokenOptions <
25+ TQueryFnData = unknown ,
26+ TError = DefaultError ,
27+ TData = TQueryFnData ,
28+ TQueryKey extends QueryKey = QueryKey ,
29+ > = OmitKeyof <
30+ CreateQueryOptions < TQueryFnData , TError , TData , TQueryKey > ,
31+ 'queryFn'
32+ > & {
33+ queryFn ?: Exclude <
34+ CreateQueryOptions < TQueryFnData , TError , TData , TQueryKey > [ 'queryFn' ] ,
35+ SkipToken | undefined
36+ >
37+ }
38+
39+ type NonUndefinedGuard < T > = T extends undefined ? never : T
40+
2441export type DefinedInitialDataOptions <
2542 TQueryFnData = unknown ,
2643 TError = DefaultError ,
2744 TData = TQueryFnData ,
2845 TQueryKey extends QueryKey = QueryKey ,
29- > = CreateQueryOptions < TQueryFnData , TError , TData , TQueryKey > & {
46+ > = Omit <
47+ CreateQueryOptions < TQueryFnData , TError , TData , TQueryKey > ,
48+ 'queryFn'
49+ > & {
3050 initialData :
3151 | NonUndefinedGuard < TQueryFnData >
3252 | ( ( ) => NonUndefinedGuard < TQueryFnData > )
53+ queryFn ?: QueryFunction < TQueryFnData , TQueryKey >
3354}
3455
3556/**
@@ -62,7 +83,40 @@ export function queryOptions<
6283> (
6384 options : DefinedInitialDataOptions < TQueryFnData , TError , TData , TQueryKey > ,
6485) : DefinedInitialDataOptions < TQueryFnData , TError , TData , TQueryKey > & {
65- queryKey : DataTag < TQueryKey , TQueryFnData >
86+ queryKey : DataTag < TQueryKey , TQueryFnData , TError >
87+ }
88+
89+ /**
90+ * Allows to share and re-use query options in a type-safe way.
91+ *
92+ * The `queryKey` will be tagged with the type from `queryFn`.
93+ *
94+ * **Example**
95+ *
96+ * ```ts
97+ * const { queryKey } = queryOptions({
98+ * queryKey: ['key'],
99+ * queryFn: () => Promise.resolve(5),
100+ * // ^? Promise<number>
101+ * })
102+ *
103+ * const queryClient = new QueryClient()
104+ * const data = queryClient.getQueryData(queryKey)
105+ * // ^? number | undefined
106+ * ```
107+ * @param options - The query options to tag with the type from `queryFn`.
108+ * @returns The tagged query options.
109+ * @public
110+ */
111+ export function queryOptions <
112+ TQueryFnData = unknown ,
113+ TError = DefaultError ,
114+ TData = TQueryFnData ,
115+ TQueryKey extends QueryKey = QueryKey ,
116+ > (
117+ options : UnusedSkipTokenOptions < TQueryFnData , TError , TData , TQueryKey > ,
118+ ) : UnusedSkipTokenOptions < TQueryFnData , TError , TData , TQueryKey > & {
119+ queryKey : DataTag < TQueryKey , TQueryFnData , TError >
66120}
67121
68122/**
@@ -95,7 +149,7 @@ export function queryOptions<
95149> (
96150 options : UndefinedInitialDataOptions < TQueryFnData , TError , TData , TQueryKey > ,
97151) : UndefinedInitialDataOptions < TQueryFnData , TError , TData , TQueryKey > & {
98- queryKey : DataTag < TQueryKey , TQueryFnData >
152+ queryKey : DataTag < TQueryKey , TQueryFnData , TError >
99153}
100154
101155/**
0 commit comments