Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 19 additions & 9 deletions packages/react-query/src/__tests__/useQueries.test-d.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -61,19 +61,29 @@ describe('UseQueries config object overload', () => {
})

it('should be possible to define a different TData than TQueryFnData using select with queryOptions spread into useQuery', () => {
const queryKey = ['key'] as const
const queryFn = () => Promise.resolve(1)
type TQueryFnData = Awaited<ReturnType<typeof queryFn>>

const query1 = queryOptions({
queryKey: ['key'],
queryFn: () => Promise.resolve(1),
queryKey,
queryFn,
select: (data) => data > 1,
})

const query2 = {
queryKey: ['key'],
queryFn: () => Promise.resolve(1),
select: (data: number) => data > 1,
}

const queryResults = useQueries({ queries: [query1, query2] })
const queryResults = useQueries({
queries: [
query1,
{
queryKey,
queryFn,
select: (data) => {
expectTypeOf(data).toEqualTypeOf<number>()
return data > 1
},
} satisfies UseQueryOptions<TQueryFnData, Error, boolean, typeof queryKey>,
] as const,
})
const query1Data = queryResults[0].data
const query2Data = queryResults[1].data

Expand Down
28 changes: 19 additions & 9 deletions packages/react-query/src/__tests__/useSuspenseQueries.test-d.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -49,19 +49,29 @@ describe('UseSuspenseQueries config object overload', () => {
})

it('should be possible to define a different TData than TQueryFnData using select with queryOptions spread into useQuery', () => {
const queryKey = ['key'] as const
const queryFn = () => Promise.resolve(1)
type TQueryFnData = Awaited<ReturnType<typeof queryFn>>

const query1 = queryOptions({
queryKey: ['key'],
queryFn: () => Promise.resolve(1),
queryKey,
queryFn,
select: (data) => data > 1,
})

const query2 = {
queryKey: ['key'],
queryFn: () => Promise.resolve(1),
select: (data: number) => data > 1,
}

const queryResults = useSuspenseQueries({ queries: [query1, query2] })
const queryResults = useSuspenseQueries({
queries: [
query1,
{
queryKey,
queryFn,
select: (data) => {
expectTypeOf(data).toEqualTypeOf<number>()
return data > 1
},
} satisfies UseQueryOptions<TQueryFnData, Error, boolean, typeof queryKey>,
] as const,
})
const query1Data = queryResults[0].data
const query2Data = queryResults[1].data

Expand Down
6 changes: 6 additions & 0 deletions packages/react-query/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,20 @@ export { usePrefetchInfiniteQuery } from './usePrefetchInfiniteQuery'
export { queryOptions } from './queryOptions'
export type {
DefinedInitialDataOptions,
DefinedInitialDataOptionsResult,
UndefinedInitialDataOptions,
UndefinedInitialDataOptionsResult,
UnusedSkipTokenOptions,
UnusedSkipTokenOptionsResult,
} from './queryOptions'
export { infiniteQueryOptions } from './infiniteQueryOptions'
export type {
DefinedInitialDataInfiniteOptions,
DefinedInitialDataInfiniteOptionsResult,
UndefinedInitialDataInfiniteOptions,
UndefinedInitialDataInfiniteOptionsResult,
UnusedSkipTokenInfiniteOptions,
UnusedSkipTokenInfiniteOptionsResult,
} from './infiniteQueryOptions'
export {
QueryClientContext,
Expand Down
75 changes: 63 additions & 12 deletions packages/react-query/src/infiniteQueryOptions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,25 @@ export type UndefinedInitialDataInfiniteOptions<
>
}

export type UndefinedInitialDataInfiniteOptionsResult<
TQueryFnData,
TError = DefaultError,
TData = InfiniteData<TQueryFnData>,
TQueryKey extends QueryKey = QueryKey,
TPageParam = unknown,
> = Omit<
UndefinedInitialDataInfiniteOptions<
TQueryFnData,
TError,
TData,
TQueryKey,
TPageParam
>,
'queryKey'
> & {
queryKey: DataTag<TQueryKey, InfiniteData<TQueryFnData>, TError>
}

export type UnusedSkipTokenInfiniteOptions<
TQueryFnData,
TError = DefaultError,
Expand All @@ -53,6 +72,25 @@ export type UnusedSkipTokenInfiniteOptions<
>
}

export type UnusedSkipTokenInfiniteOptionsResult<
TQueryFnData,
TError = DefaultError,
TData = InfiniteData<TQueryFnData>,
TQueryKey extends QueryKey = QueryKey,
TPageParam = unknown,
> = Omit<
UnusedSkipTokenInfiniteOptions<
TQueryFnData,
TError,
TData,
TQueryKey,
TPageParam
>,
'queryKey'
> & {
queryKey: DataTag<TQueryKey, InfiniteData<TQueryFnData>, TError>
}

export type DefinedInitialDataInfiniteOptions<
TQueryFnData,
TError = DefaultError,
Expand All @@ -72,6 +110,25 @@ export type DefinedInitialDataInfiniteOptions<
| undefined
}

export type DefinedInitialDataInfiniteOptionsResult<
TQueryFnData,
TError = DefaultError,
TData = InfiniteData<TQueryFnData>,
TQueryKey extends QueryKey = QueryKey,
TPageParam = unknown,
> = Omit<
DefinedInitialDataInfiniteOptions<
TQueryFnData,
TError,
TData,
TQueryKey,
TPageParam
>,
'queryKey'
> & {
queryKey: DataTag<TQueryKey, InfiniteData<TQueryFnData>, TError>
}

export function infiniteQueryOptions<
TQueryFnData,
TError = DefaultError,
Expand All @@ -86,15 +143,13 @@ export function infiniteQueryOptions<
TQueryKey,
TPageParam
>,
): DefinedInitialDataInfiniteOptions<
): DefinedInitialDataInfiniteOptionsResult<
TQueryFnData,
TError,
TData,
TQueryKey,
TPageParam
> & {
queryKey: DataTag<TQueryKey, InfiniteData<TQueryFnData>, TError>
}
>

export function infiniteQueryOptions<
TQueryFnData,
Expand All @@ -110,15 +165,13 @@ export function infiniteQueryOptions<
TQueryKey,
TPageParam
>,
): UnusedSkipTokenInfiniteOptions<
): UnusedSkipTokenInfiniteOptionsResult<
TQueryFnData,
TError,
TData,
TQueryKey,
TPageParam
> & {
queryKey: DataTag<TQueryKey, InfiniteData<TQueryFnData>, TError>
}
>

export function infiniteQueryOptions<
TQueryFnData,
Expand All @@ -134,15 +187,13 @@ export function infiniteQueryOptions<
TQueryKey,
TPageParam
>,
): UndefinedInitialDataInfiniteOptions<
): UndefinedInitialDataInfiniteOptionsResult<
TQueryFnData,
TError,
TData,
TQueryKey,
TPageParam
> & {
queryKey: DataTag<TQueryKey, InfiniteData<TQueryFnData>, TError>
}
>

export function infiniteQueryOptions(options: unknown) {
return options
Expand Down
48 changes: 39 additions & 9 deletions packages/react-query/src/queryOptions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,18 @@ export type UndefinedInitialDataOptions<
| NonUndefinedGuard<TQueryFnData>
}

export type UndefinedInitialDataOptionsResult<
TQueryFnData = unknown,
TError = DefaultError,
TData = TQueryFnData,
TQueryKey extends QueryKey = QueryKey,
> = Omit<
UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,
'queryKey'
> & {
queryKey: DataTag<TQueryKey, TQueryFnData, TError>
}

export type UnusedSkipTokenOptions<
TQueryFnData = unknown,
TError = DefaultError,
Expand All @@ -37,6 +49,18 @@ export type UnusedSkipTokenOptions<
>
}

export type UnusedSkipTokenOptionsResult<
TQueryFnData = unknown,
TError = DefaultError,
TData = TQueryFnData,
TQueryKey extends QueryKey = QueryKey,
> = Omit<
UnusedSkipTokenOptions<TQueryFnData, TError, TData, TQueryKey>,
'queryKey'
> & {
queryKey: DataTag<TQueryKey, TQueryFnData, TError>
}

export type DefinedInitialDataOptions<
TQueryFnData = unknown,
TError = DefaultError,
Expand All @@ -49,16 +73,26 @@ export type DefinedInitialDataOptions<
queryFn?: QueryFunction<TQueryFnData, TQueryKey>
}

export type DefinedInitialDataOptionsResult<
TQueryFnData = unknown,
TError = DefaultError,
TData = TQueryFnData,
TQueryKey extends QueryKey = QueryKey,
> = Omit<
DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,
'queryKey'
> & {
queryKey: DataTag<TQueryKey, TQueryFnData, TError>
}

export function queryOptions<
TQueryFnData = unknown,
TError = DefaultError,
TData = TQueryFnData,
TQueryKey extends QueryKey = QueryKey,
>(
options: DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,
): DefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey> & {
queryKey: DataTag<TQueryKey, TQueryFnData, TError>
}
): DefinedInitialDataOptionsResult<TQueryFnData, TError, TData, TQueryKey>

export function queryOptions<
TQueryFnData = unknown,
Expand All @@ -67,9 +101,7 @@ export function queryOptions<
TQueryKey extends QueryKey = QueryKey,
>(
options: UnusedSkipTokenOptions<TQueryFnData, TError, TData, TQueryKey>,
): UnusedSkipTokenOptions<TQueryFnData, TError, TData, TQueryKey> & {
queryKey: DataTag<TQueryKey, TQueryFnData, TError>
}
): UnusedSkipTokenOptionsResult<TQueryFnData, TError, TData, TQueryKey>

export function queryOptions<
TQueryFnData = unknown,
Expand All @@ -78,9 +110,7 @@ export function queryOptions<
TQueryKey extends QueryKey = QueryKey,
>(
options: UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey>,
): UndefinedInitialDataOptions<TQueryFnData, TError, TData, TQueryKey> & {
queryKey: DataTag<TQueryKey, TQueryFnData, TError>
}
): UndefinedInitialDataOptionsResult<TQueryFnData, TError, TData, TQueryKey>

export function queryOptions(options: unknown) {
return options
Expand Down
37 changes: 24 additions & 13 deletions packages/react-query/src/useQueries.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,15 +82,21 @@ type GetUseQueryOptionsForUseQueries<T> =
queryFn?:
| QueryFunction<infer TQueryFnData, infer TQueryKey>
| SkipTokenForUseQueries
select?: (data: any) => infer TData
throwOnError?: ThrowOnError<any, infer TError, any, any>
}
? UseQueryOptionsForUseQueries<
TQueryFnData,
unknown extends TError ? DefaultError : TError,
unknown extends TData ? TQueryFnData : TData,
TQueryKey
>
? T extends { select?: (data: TQueryFnData) => infer TData }
? UseQueryOptionsForUseQueries<
TQueryFnData,
unknown extends TError ? DefaultError : TError,
unknown extends TData ? TQueryFnData : TData,
TQueryKey
>
: UseQueryOptionsForUseQueries<
TQueryFnData,
unknown extends TError ? DefaultError : TError,
TQueryFnData,
TQueryKey
>
: // Fallback
UseQueryOptionsForUseQueries

Expand Down Expand Up @@ -131,14 +137,19 @@ type GetUseQueryResult<T> =
queryFn?:
| QueryFunction<infer TQueryFnData, any>
| SkipTokenForUseQueries
select?: (data: any) => infer TData
throwOnError?: ThrowOnError<any, infer TError, any, any>
}
? GetDefinedOrUndefinedQueryResult<
T,
unknown extends TData ? TQueryFnData : TData,
unknown extends TError ? DefaultError : TError
>
? T extends { select?: (data: TQueryFnData) => infer TData }
? GetDefinedOrUndefinedQueryResult<
T,
unknown extends TData ? TQueryFnData : TData,
unknown extends TError ? DefaultError : TError
>
: GetDefinedOrUndefinedQueryResult<
T,
TQueryFnData,
unknown extends TError ? DefaultError : TError
>
: // Fallback
UseQueryResult

Expand Down
Loading