Skip to content

Commit 716f411

Browse files
authored
Merge pull request #5 from ryfylke-react-as/2-types-are-wrong-in-extended-loader-in-certain-situations
fix: Types for extended loaders
2 parents a459e8a + b5ebb86 commit 716f411

File tree

4 files changed

+17
-13
lines changed

4 files changed

+17
-13
lines changed

src/createLoader.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,14 @@ export const createLoader = <
4040
A = never
4141
>(
4242
createLoaderArgs: Types.CreateLoaderArgs<P, QRU, R, A>
43-
): Types.Loader<P, R, A> => {
43+
): Types.Loader<P, R, QRU, A> => {
4444
const useLoader = createUseLoader({
4545
queries:
4646
createLoaderArgs.queries ?? (() => [] as unknown as QRU),
4747
transform: createLoaderArgs.transform,
4848
});
4949

50-
const loader: Types.Loader<P, R, A> = {
50+
const loader: Types.Loader<P, R, QRU, A> = {
5151
useLoader,
5252
onLoading: createLoaderArgs.onLoading,
5353
onError: createLoaderArgs.onError,
@@ -69,9 +69,9 @@ export const createLoader = <
6969
...loaderArgs
7070
}: Partial<Types.CreateLoaderArgs<Pb, QRUb, Rb, Ab>>) {
7171
const extendedLoader = {
72-
...(this as unknown as Types.Loader<Pb, Rb, Ab>),
72+
...(this as unknown as Types.Loader<Pb, Rb, QRUb, Ab>),
7373
...loaderArgs,
74-
} as Types.Loader<Pb, Rb, Ab>;
74+
} as Types.Loader<Pb, Rb, QRUb, Ab>;
7575

7676
if (queries) {
7777
const newUseLoader = createUseLoader({

src/types.ts

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,9 @@ export type InferLoaderData<T> = T extends Loader<
9090
any
9191
>
9292
? X
93-
: T extends Loader<never, infer Y, any>
93+
: T extends Loader<never, infer Y, any, any>
9494
? Y
95-
: T extends Loader<any, infer Z, never>
95+
: T extends Loader<any, infer Z, never, any>
9696
? Z
9797
: never;
9898

@@ -162,6 +162,7 @@ export type CreateLoaderArgs<
162162
export type Loader<
163163
P extends unknown,
164164
R extends unknown,
165+
QRU extends readonly UseQueryResult<unknown>[],
165166
A = never
166167
> = {
167168
/** A hook that runs all queries and returns aggregated result */
@@ -185,15 +186,17 @@ export type Loader<
185186
whileFetching?: WhileFetchingArgs<P, R>;
186187
/** Returns a new `Loader` extended from this `Loader`, with given overrides. */
187188
extend: <
188-
QRUb extends readonly UseQueryResult<unknown>[],
189+
QRUb extends readonly UseQueryResult<unknown>[] = QRU,
189190
Pb extends unknown = P,
190-
Rb extends unknown = QRUb extends unknown
191-
? R
191+
Rb extends unknown = QRUb extends QRU
192+
? R extends never
193+
? QRU
194+
: R
192195
: MakeDataRequired<QRUb>,
193196
Ab = A
194197
>(
195198
newLoader: Partial<CreateLoaderArgs<Pb, QRUb, Rb, Ab>>
196-
) => Loader<Pb, Rb, Ab>;
199+
) => Loader<Pb, Rb, QRUb extends never ? QRU : QRUb, Ab>;
197200
/** The component to use to switch between rendering the different query states. */
198201
LoaderComponent: Component<CustomLoaderProps>;
199202
};
@@ -204,4 +207,4 @@ export type WithLoaderArgs<
204207
P extends unknown,
205208
R extends unknown,
206209
A = never
207-
> = Loader<P, R, A>;
210+
> = Loader<P, R, [], A>;

src/withLoader.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@ import * as Types from "./types";
66
export const withLoader = <
77
P extends Record<string, any>,
88
R extends unknown,
9+
QRU extends readonly Types.UseQueryResult<unknown>[],
910
A = never
1011
>(
1112
Component: Types.ComponentWithLoaderData<P, R>,
12-
loader: Types.Loader<P, R, A>
13+
loader: Types.Loader<P, R, QRU, A>
1314
): Types.Component<P> => {
1415
let CachedComponent: Types.ComponentWithLoaderData<P, R>;
1516
const LoadedComponent = (props: P) => {

testing-app/src/tests.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,13 +280,13 @@ describe("withLoader", () => {
280280
[useGetPokemonByNameQuery(arg)] as const,
281281
queriesArg: (props: { name: string }) => props.name,
282282
onLoading: () => <div>Loading</div>,
283+
transform: (q) => ({ test: "best" }),
283284
}).extend({
284285
queries: (arg: string) =>
285286
[
286287
useGetPokemonByNameQuery(arg),
287288
useGetPokemonsQuery(undefined),
288289
] as const,
289-
transform: (q) => q,
290290
});
291291

292292
const Component = withLoader((props, loaderData) => {

0 commit comments

Comments
 (0)