diff --git a/src/createLoader.ts b/src/createLoader.ts index ecb3c9d..eaf8a2b 100644 --- a/src/createLoader.ts +++ b/src/createLoader.ts @@ -40,14 +40,14 @@ export const createLoader = < A = never >( createLoaderArgs: Types.CreateLoaderArgs -): Types.Loader => { +): Types.Loader => { const useLoader = createUseLoader({ queries: createLoaderArgs.queries ?? (() => [] as unknown as QRU), transform: createLoaderArgs.transform, }); - const loader: Types.Loader = { + const loader: Types.Loader = { useLoader, onLoading: createLoaderArgs.onLoading, onError: createLoaderArgs.onError, @@ -69,9 +69,9 @@ export const createLoader = < ...loaderArgs }: Partial>) { const extendedLoader = { - ...(this as unknown as Types.Loader), + ...(this as unknown as Types.Loader), ...loaderArgs, - } as Types.Loader; + } as Types.Loader; if (queries) { const newUseLoader = createUseLoader({ diff --git a/src/types.ts b/src/types.ts index 6192e33..ddaa63b 100644 --- a/src/types.ts +++ b/src/types.ts @@ -90,9 +90,9 @@ export type InferLoaderData = T extends Loader< any > ? X - : T extends Loader + : T extends Loader ? Y - : T extends Loader + : T extends Loader ? Z : never; @@ -162,6 +162,7 @@ export type CreateLoaderArgs< export type Loader< P extends unknown, R extends unknown, + QRU extends readonly UseQueryResult[], A = never > = { /** A hook that runs all queries and returns aggregated result */ @@ -185,15 +186,17 @@ export type Loader< whileFetching?: WhileFetchingArgs; /** Returns a new `Loader` extended from this `Loader`, with given overrides. */ extend: < - QRUb extends readonly UseQueryResult[], + QRUb extends readonly UseQueryResult[] = QRU, Pb extends unknown = P, - Rb extends unknown = QRUb extends unknown - ? R + Rb extends unknown = QRUb extends QRU + ? R extends never + ? QRU + : R : MakeDataRequired, Ab = A >( newLoader: Partial> - ) => Loader; + ) => Loader; /** The component to use to switch between rendering the different query states. */ LoaderComponent: Component; }; @@ -204,4 +207,4 @@ export type WithLoaderArgs< P extends unknown, R extends unknown, A = never -> = Loader; +> = Loader; diff --git a/src/withLoader.tsx b/src/withLoader.tsx index c2ce5fa..f1b048b 100644 --- a/src/withLoader.tsx +++ b/src/withLoader.tsx @@ -6,10 +6,11 @@ import * as Types from "./types"; export const withLoader = < P extends Record, R extends unknown, + QRU extends readonly Types.UseQueryResult[], A = never >( Component: Types.ComponentWithLoaderData, - loader: Types.Loader + loader: Types.Loader ): Types.Component

=> { let CachedComponent: Types.ComponentWithLoaderData; const LoadedComponent = (props: P) => { diff --git a/testing-app/src/tests.test.tsx b/testing-app/src/tests.test.tsx index 1ccd404..be69350 100644 --- a/testing-app/src/tests.test.tsx +++ b/testing-app/src/tests.test.tsx @@ -280,13 +280,13 @@ describe("withLoader", () => { [useGetPokemonByNameQuery(arg)] as const, queriesArg: (props: { name: string }) => props.name, onLoading: () =>

Loading
, + transform: (q) => ({ test: "best" }), }).extend({ queries: (arg: string) => [ useGetPokemonByNameQuery(arg), useGetPokemonsQuery(undefined), ] as const, - transform: (q) => q, }); const Component = withLoader((props, loaderData) => {