From 9b19dba19638c4da9329a50a5514ab22f2847533 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5kon?= Date: Mon, 27 Feb 2023 20:12:18 +0100 Subject: [PATCH 1/4] fix: extend types --- src/createLoader.ts | 25 ++++++++------- src/types.ts | 58 +++++++++++++++++++++------------- testing-app/src/tests.test.tsx | 14 ++++++-- 3 files changed, 62 insertions(+), 35 deletions(-) diff --git a/src/createLoader.ts b/src/createLoader.ts index 846c5ca..05916f8 100644 --- a/src/createLoader.ts +++ b/src/createLoader.ts @@ -82,18 +82,21 @@ export const createLoader = < LoaderComponent: createLoaderArgs.loaderComponent ?? RTKLoader, extend: function < - Qb extends Types._Q, - Db extends Types._D, - Eb extends Types._E, - Pb extends unknown = P, - Rb = Qb extends unknown + Qb extends Types._Q = Q, + Db extends Types._D = D, + Eb extends Types._E = E, + Rb extends unknown = Types.AllEql< + Q, + Qb, + D, + Db, + E, + Eb + > extends true ? R - : Types.ResolveDataShape< - Types.MakeDataRequired, - Db, - Eb - >, - Ab extends unknown = A + : Types.ResolveLoadedDataShape, + Pb extends unknown = P, + Ab = A >({ useQueries, transform, diff --git a/src/types.ts b/src/types.ts index 9ecc757..07c7776 100644 --- a/src/types.ts +++ b/src/types.ts @@ -2,6 +2,22 @@ import { SerializedError } from "@reduxjs/toolkit"; import { FetchBaseQueryError } from "@reduxjs/toolkit/dist/query"; import { ReactElement } from "react"; +export type AllNever = + | Q + | D + | E + | R extends never + ? true + : false; + +export type AllEql = Q extends Qb + ? D extends Db + ? E extends Eb + ? true + : false + : false + : false; + /** Result of a RTK useQuery hook */ export type UseQueryResult = { // Base query state @@ -39,9 +55,9 @@ export type UseQueryResult = { }; /** _X are types that are extended from in the generics */ -export type _Q = Record>; -export type _D = Record>; -export type _E = unknown; +export type _Q = Record> | never; +export type _D = Record> | never; +export type _E = unknown | never; export type _P = Record; export type _R = unknown; @@ -50,7 +66,7 @@ export type MakeDataRequired = { [K in keyof T]: T[K] & { data: NonNullable }; }; -export type DataShape< +export type DataShapeInput< Q extends _Q, D extends _D, E extends _E @@ -82,6 +98,12 @@ export type ResolveDataShape< : { queries: Q; deferredQueries: D } : { queries: Q; deferredQueries: D; payload: E }; +export type ResolveLoadedDataShape< + Q extends _Q, + D extends _D, + E extends _E +> = ResolveDataShape, D, E>; + /** Use: `(...args: OptionalGenericArg) => void;` * Allows either `T` or `none` for the parameter */ @@ -92,7 +114,7 @@ export type LoaderTransformFunction< D extends _D, E extends _E, R extends unknown -> = (data: ResolveDataShape, D, E>) => R; +> = (data: ResolveLoadedDataShape) => R; export type CreateUseLoaderArgs< Q extends _Q, @@ -113,11 +135,9 @@ export type CreateUseLoaderArgs< */ useQueries: ( ...args: OptionalGenericArg - ) => DataShape; + ) => DataShapeInput; /** Transforms the output of the queries */ - transform?: ( - data: ResolveDataShape, D, E> - ) => R; + transform?: (data: ResolveLoadedDataShape) => R; }; export type UseLoader = { @@ -188,7 +208,7 @@ export type CreateLoaderArgs< Q extends _Q, D extends _D, E extends _E, - R extends unknown = MakeDataRequired, + R extends unknown, A = never > = Partial> & { /** Generates an argument for the `queries` based on component props */ @@ -226,9 +246,9 @@ export type CreateLoader< export type Loader< P extends unknown, R extends unknown, - Q extends _Q, - D extends _D, - E extends _E, + Q extends _Q = never, + D extends _D = never, + E extends _E = never, A = never > = { /** A hook that runs all queries and returns aggregated result */ @@ -255,16 +275,10 @@ export type Loader< Qb extends _Q = Q, Db extends _D = D, Eb extends _E = E, + Rb extends unknown = AllEql extends true + ? R + : ResolveLoadedDataShape, Pb extends unknown = P, - Rb extends unknown = ResolveDataShape< - Qb, - Db, - Eb - > extends never - ? R extends never - ? Q - : R - : ResolveDataShape, Db, Eb>, Ab = A >( newLoader: Partial> diff --git a/testing-app/src/tests.test.tsx b/testing-app/src/tests.test.tsx index 136fd0d..690824c 100644 --- a/testing-app/src/tests.test.tsx +++ b/testing-app/src/tests.test.tsx @@ -549,6 +549,7 @@ describe("withLoader", () => { return (
{loader.queries.pokemon.data.name}
+
{loader.foobar}