11import { SerializedError } from "@reduxjs/toolkit" ;
22import { FetchBaseQueryError } from "@reduxjs/toolkit/dist/query" ;
33import { ReactElement } from "react" ;
4+ import { useCreateQuery } from "./createQuery" ;
45
56/** Result of a RTK useQuery hook */
67export type UseQueryResult < T > = {
@@ -38,52 +39,62 @@ export type UseQueryResult<T> = {
3839 refetch : ( ) => void ;
3940} ;
4041
41- export type MakeDataRequired <
42- T extends readonly UseQueryResult < unknown > [ ]
43- > = {
42+ /** _X are types that are extended from in the generics */
43+ export type _Q = Record < string , UseQueryResult < unknown > > ;
44+ export type _D = Record < string , UseQueryResult < unknown > > ;
45+ export type _E = unknown ;
46+ export type _P = Record < string , unknown > ;
47+ export type _R = unknown ;
48+
49+ export type MakeDataRequired < T extends _Q > = {
4450 // @ts -ignore: TS2536: Type '"data"' cannot be used to index type 'T[K]'.
4551 [ K in keyof T ] : T [ K ] & { data : NonNullable < T [ K ] [ "data" ] > } ;
4652} ;
4753
54+ export type DataShape <
55+ Q extends _Q ,
56+ D extends _D ,
57+ E extends _E
58+ > = {
59+ queries ?: Q ;
60+ deferredQueries ?: D ;
61+ payload ?: E ;
62+ } ;
63+
4864/** Use: `(...args: OptionalGenericArg<T>) => void;`
4965 * Allows either `T` or `none` for the parameter
5066 */
5167export type OptionalGenericArg < T > = T extends never ? [ ] : [ T ] ;
5268
5369export type LoaderTransformFunction <
54- QRU extends readonly UseQueryResult < unknown > [ ] ,
55- QRUD extends readonly UseQueryResult < unknown > [ ] ,
70+ Q extends _Q ,
71+ D extends _D ,
72+ E extends _E ,
5673 R extends unknown
57- > = ( queries : MakeDataRequired < QRU > , deferredQueries : QRUD ) => R ;
74+ > = ( data : DataShape < MakeDataRequired < Q > , D , E > ) => R ;
5875
5976export type CreateUseLoaderArgs <
60- QRU extends readonly UseQueryResult < unknown > [ ] ,
61- QRUD extends readonly UseQueryResult < unknown > [ ] ,
62- R extends unknown ,
77+ Q extends _Q ,
78+ D extends _D ,
79+ E extends _E ,
80+ R extends _R ,
6381 A = never
6482> = {
6583 /** Should return a list of RTK useQuery results.
6684 * Example:
6785 * ```typescript
68- * (args: Args) => [
69- * useGetPokemonQuery(args.pokemonId),
70- * useGetSomethingElse(args.someArg)
71- * ] as const
86+ * (args: Args) => ({
87+ * queries: {
88+ * pokemon: useGetPokemonQuery(args.pokemonId),
89+ * }
90+ * })
7291 * ```
7392 */
74- queries : ( ...args : OptionalGenericArg < A > ) => QRU ;
75- /** Should return a list of RTK useQuery results.
76- * Example:
77- * ```typescript
78- * (args: Args) => [
79- * useGetPokemonQuery(args.pokemonId),
80- * useGetSomethingElse(args.someArg)
81- * ] as const
82- * ```
83- */
84- deferredQueries ?: ( ...args : OptionalGenericArg < A > ) => QRUD ;
93+ useQuery : (
94+ ...args : OptionalGenericArg < A >
95+ ) => DataShape < Q , D , E > ;
8596 /** Transforms the output of the queries */
86- transform ?: LoaderTransformFunction < QRU , QRUD , R > ;
97+ transform ?: ( data : DataShape < Q , D , E > ) => R ;
8798} ;
8899
89100export type UseLoader < A , R > = (
@@ -147,11 +158,12 @@ export type CustomLoaderProps<T = unknown> = {
147158
148159export type CreateLoaderArgs <
149160 P extends unknown ,
150- QRU extends readonly UseQueryResult < unknown > [ ] ,
151- QRUD extends readonly UseQueryResult < unknown > [ ] ,
152- R extends unknown = MakeDataRequired < QRU > ,
161+ Q extends _Q ,
162+ D extends _D ,
163+ E extends _E ,
164+ R extends unknown = MakeDataRequired < Q > ,
153165 A = never
154- > = Partial < CreateUseLoaderArgs < QRU , QRUD , R , A > > & {
166+ > = Partial < CreateUseLoaderArgs < Q , D , E , R , A > > & {
155167 /** Generates an argument for the `queries` based on component props */
156168 queriesArg ?: ( props : P ) => A ;
157169 /** Determines what to render while loading (with no data to fallback on) */
@@ -176,7 +188,9 @@ export type CreateLoaderArgs<
176188export type Loader <
177189 P extends unknown ,
178190 R extends unknown ,
179- QRU extends readonly UseQueryResult < unknown > [ ] = [ ] ,
191+ Q extends _Q = _Q ,
192+ D extends _D = _D ,
193+ E extends _E = _E ,
180194 A = never
181195> = {
182196 /** A hook that runs all queries and returns aggregated result */
@@ -200,18 +214,26 @@ export type Loader<
200214 whileFetching ?: WhileFetchingArgs < P , R > ;
201215 /** Returns a new `Loader` extended from this `Loader`, with given overrides. */
202216 extend : <
203- QRUb extends readonly UseQueryResult < unknown > [ ] = QRU ,
204- QRUDb extends readonly UseQueryResult < unknown > [ ] = [ ] ,
217+ Qb extends _Q = Q ,
218+ Db extends _D = _Q ,
219+ Eb extends _E = _E ,
205220 Pb extends unknown = P ,
206- Rb extends unknown = QRUb extends QRU
221+ Rb extends unknown = Qb extends Q
207222 ? R extends never
208- ? QRU
223+ ? Q
209224 : R
210- : MakeDataRequired < QRUb > ,
225+ : DataShape < MakeDataRequired < Qb > , Db , Eb > ,
211226 Ab = A
212227 > (
213- newLoader : Partial < CreateLoaderArgs < Pb , QRUb , QRUDb , Rb , Ab > >
214- ) => Loader < Pb , Rb , QRUb extends never ? QRU : QRUb , Ab > ;
228+ newLoader : Partial < CreateLoaderArgs < Pb , Qb , Db , Rb , Ab > >
229+ ) => Loader <
230+ Pb ,
231+ Rb ,
232+ Qb extends never ? Q : Qb ,
233+ Qb extends never ? D : Db ,
234+ Qb extends never ? E : Eb ,
235+ Ab
236+ > ;
215237 /** The component to use to switch between rendering the different query states. */
216238 LoaderComponent : Component < CustomLoaderProps > ;
217239} ;
@@ -246,4 +268,30 @@ export type WithLoaderArgs<
246268 P extends unknown ,
247269 R extends unknown ,
248270 A = never
249- > = Loader < P , R , [ ] , A > ;
271+ > = Loader < P , R , _Q , _Q , unknown , A > ;
272+
273+ const _createLoaderTypeTest = <
274+ P extends unknown ,
275+ Q extends _Q ,
276+ D extends _D ,
277+ E extends _E ,
278+ R extends unknown = MakeDataRequired < Q > ,
279+ A = never
280+ > (
281+ args : CreateLoaderArgs < P , Q , D , E , R >
282+ ) : Loader < P , R , Q , D , A > => {
283+ return { } as Loader < P , R , Q , D , A > ;
284+ } ;
285+
286+ const asd = _createLoaderTypeTest ( {
287+ useQuery : ( ) => {
288+ return {
289+ queries : {
290+ test : useCreateQuery ( async ( ) => "foo" as const ) ,
291+ } ,
292+ deferredQueries : {
293+ best : useCreateQuery ( async ( ) => "bar" as const ) ,
294+ } ,
295+ } ;
296+ } ,
297+ } ) ;
0 commit comments