1
0
mirror of synced 2026-02-03 18:01:02 -05:00

Compare commits

...

7 Commits

Author SHA1 Message Date
Brandon Bayer
a0b7a08db6 even stricter typing by removing undefined only if suspense & enabled are true 2021-02-10 12:14:10 -05:00
Brian Liu
91d7a8a353 Merge branch 'canary' into use-query-data-type 2021-02-10 13:48:55 +11:00
Brian Liu
aa681ff50c Added TS function overload for return types 2021-02-10 13:05:26 +11:00
Brian Liu
7b7eaeee4b Revert "Fixed useQuery return data type"
This reverts commit cb2b6a1777.
2021-02-10 10:08:56 +11:00
Brian Liu
a96b8735cc Revert "Fixed test fails"
This reverts commit cc64243006.
2021-02-10 10:08:44 +11:00
Brian Liu
cc64243006 Fixed test fails 2021-02-09 12:25:06 +11:00
Brian Liu
cb2b6a1777 Fixed useQuery return data type 2021-02-09 11:26:42 +11:00
2 changed files with 53 additions and 7 deletions

View File

@@ -10,6 +10,8 @@ export const Project = () => {
const [deleteProjectMutation, {isSuccess}] = useMutation(deleteProject)
const [project] = useQuery(getProject, {id: projectId}, {enabled: !isSuccess})
if (!project) return null
return (
<>
<Head>

View File

@@ -20,16 +20,32 @@ import {
useDefaultQueryConfig,
} from "./utils/react-query-utils"
type QueryLazyOptions = {suspense: unknown} | {enabled: unknown}
type QueryNonLazyOptions =
| {suspense: true; enabled?: never}
| {suspense?: never; enabled: true}
| {suspense: true; enabled: true}
// -------------------------
// useQuery
// -------------------------
type RestQueryResult<TResult> = Omit<QueryResult<TResult>, "data"> & QueryCacheFunctions<TResult>
export function useQuery<T extends QueryFn, TResult = PromiseReturnType<T>>(
queryFn: T,
params: FirstParam<T>,
options?: QueryOptions<TResult> & QueryNonLazyOptions,
): [TResult, RestQueryResult<TResult>]
export function useQuery<T extends QueryFn, TResult = PromiseReturnType<T>>(
queryFn: T,
params: FirstParam<T>,
options: QueryOptions<TResult> & QueryLazyOptions,
): [TResult | undefined, RestQueryResult<TResult>]
export function useQuery<T extends QueryFn, TResult = PromiseReturnType<T>>(
queryFn: T,
params: FirstParam<T>,
options?: QueryOptions<TResult>,
): [TResult, RestQueryResult<TResult>] {
) {
if (typeof queryFn === "undefined") {
throw new Error("useQuery is missing the first argument - it must be a query function")
}
@@ -57,7 +73,7 @@ export function useQuery<T extends QueryFn, TResult = PromiseReturnType<T>>(
...getQueryCacheFunctions<FirstParam<T>, TResult, T>(queryFn, params),
}
return [data as TResult, rest as RestQueryResult<TResult>]
return [data, rest as RestQueryResult<TResult>]
}
// -------------------------
@@ -66,11 +82,21 @@ export function useQuery<T extends QueryFn, TResult = PromiseReturnType<T>>(
type RestPaginatedResult<TResult> = Omit<PaginatedQueryResult<TResult>, "resolvedData"> &
QueryCacheFunctions<TResult>
export function usePaginatedQuery<T extends QueryFn, TResult = PromiseReturnType<T>>(
queryFn: T,
params: FirstParam<T>,
options?: QueryOptions<TResult> & QueryNonLazyOptions,
): [TResult, RestPaginatedResult<TResult>]
export function usePaginatedQuery<T extends QueryFn, TResult = PromiseReturnType<T>>(
queryFn: T,
params: FirstParam<T>,
options: QueryOptions<TResult> & QueryLazyOptions,
): [TResult | undefined, RestPaginatedResult<TResult>]
export function usePaginatedQuery<T extends QueryFn, TResult = PromiseReturnType<T>>(
queryFn: T,
params: FirstParam<T>,
options?: QueryOptions<TResult>,
): [TResult, RestPaginatedResult<TResult>] {
) {
if (typeof queryFn === "undefined") {
throw new Error("usePaginatedQuery is missing the first argument - it must be a query function")
}
@@ -98,7 +124,7 @@ export function usePaginatedQuery<T extends QueryFn, TResult = PromiseReturnType
...getQueryCacheFunctions<FirstParam<T>, TResult, T>(queryFn, params),
}
return [resolvedData as TResult, rest as RestPaginatedResult<TResult>]
return [resolvedData, rest as RestPaginatedResult<TResult>]
}
// -------------------------
@@ -106,7 +132,7 @@ export function usePaginatedQuery<T extends QueryFn, TResult = PromiseReturnType
// -------------------------
type RestInfiniteResult<TResult, TMoreVariable> = Omit<
InfiniteQueryResult<TResult, TMoreVariable>,
"resolvedData"
"data"
> &
QueryCacheFunctions<TResult>
@@ -125,7 +151,25 @@ export function useInfiniteQuery<
queryFn: T,
params: (fetchMoreResult: TFetchMoreResult) => FirstParam<T>,
options: InfiniteQueryConfig<TResult, TFetchMoreResult>,
): [TResult[], RestInfiniteResult<TResult, TFetchMoreResult>] {
): [TResult[], RestInfiniteResult<TResult, TFetchMoreResult> & QueryNonLazyOptions]
export function useInfiniteQuery<
T extends QueryFn,
TFetchMoreResult = any,
TResult = PromiseReturnType<T>
>(
queryFn: T,
params: (fetchMoreResult: TFetchMoreResult) => FirstParam<T>,
options: InfiniteQueryConfig<TResult, TFetchMoreResult> & QueryLazyOptions,
): [TResult[] | undefined, RestInfiniteResult<TResult, TFetchMoreResult>]
export function useInfiniteQuery<
T extends QueryFn,
TFetchMoreResult = any,
TResult = PromiseReturnType<T>
>(
queryFn: T,
params: (fetchMoreResult: TFetchMoreResult) => FirstParam<T>,
options: InfiniteQueryConfig<TResult, TFetchMoreResult>,
) {
if (typeof queryFn === "undefined") {
throw new Error("useInfiniteQuery is missing the first argument - it must be a query function")
}
@@ -156,5 +200,5 @@ export function useInfiniteQuery<
...getQueryCacheFunctions<FirstParam<T>, TResult, T>(queryFn, params),
}
return [data as TResult[], rest as RestInfiniteResult<TResult, TFetchMoreResult>]
return [data, rest as RestInfiniteResult<TResult, TFetchMoreResult>]
}