Skip to content

Commit 7600ef4

Browse files
committed
feat: add InferMutation, InferQuery, InferInfiniteQuery and other types to better DX; docs: add docs for them
1 parent 648615c commit 7600ef4

File tree

4 files changed

+194
-1
lines changed

4 files changed

+194
-1
lines changed

README.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,11 +289,39 @@ Reset current mutation
289289

290290
# [**InfiniteQueries**](https://tanstack.com/query/latest/docs/framework/react/guides/infinite-queries) -> [**MobxInfiniteQuery**](src/mobx-infinite-query.ts)
291291

292+
# [**QueryClient**](https://tanstack.com/query/latest/docs/reference/QueryClient) -> [**MobxQueryClient**](src/mobx-query-client.ts)
293+
294+
This is the same entity as `QueryClient` from **@tanstack-query/core** package, but has a bit improvenments like `hooks` and configurations for Mobx* like entities
295+
296+
292297
[_See docs for MobxQuery_](https://github.com/js2me/mobx-tanstack-query?tab=readme-ov-file#queries---mobxquery)
293298

294299

295300

296301

302+
# `InferQuery`, `InferMutation`, `InferInfiniteQuery` types
303+
304+
This types are needed to infer some other types from mutations\configs.
305+
306+
```ts
307+
type MyData = InferMutation<typeof myMutation, 'data'>
308+
type MyVariables = InferMutation<typeof myMutation, 'variables'>
309+
type MyConfig = InferMutation<typeof myMutation, 'config'>
310+
```
311+
312+
# `MobxQueryConfigFromFn`, `MobxMutationConfigFromFn`, `MobxInfiniteQueryConfigFromFn`
313+
314+
This types are needed to create configuration types from your functions of your http client
315+
316+
```ts
317+
const myApi = {
318+
createApple: (name: string): Promise<AppleDC> => ...
319+
}
320+
321+
type Config = MobxMutationConfigFromFn<typeof myApi.createApple>
322+
```
323+
324+
297325
# Usage
298326
299327
1. **Install dependencies**

src/mobx-inifinite-query.types.ts

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,18 @@ export interface MobxInfiniteQueryUpdateOptions<
7272
>
7373
> {}
7474

75+
export type MobxInfiniteQueryConfigFromFn<
76+
T extends (...args: any[]) => any,
77+
TError = DefaultError,
78+
TQueryKey extends QueryKey = QueryKey,
79+
TPageParam = unknown,
80+
> = MobxInfiniteQueryConfig<
81+
ReturnType<T> extends Promise<infer TData> ? TData : ReturnType<T>,
82+
TError,
83+
TQueryKey,
84+
TPageParam
85+
>;
86+
7587
export interface MobxInfiniteQueryConfig<
7688
TData,
7789
TError = DefaultError,
@@ -128,3 +140,55 @@ export interface MobxInfiniteQueryConfig<
128140
>,
129141
) => MobxInfiniteQueryDynamicOptions<TData, TError, TQueryKey, TPageParam>;
130142
}
143+
144+
export type InferInfiniteQuery<
145+
T extends
146+
| MobxInfiniteQueryConfig<any, any, any, any>
147+
| MobxInfiniteQuery<any, any, any>,
148+
TInferValue extends
149+
| 'data'
150+
| 'key'
151+
| 'page-param'
152+
| 'error'
153+
| 'query'
154+
| 'config',
155+
> =
156+
T extends MobxInfiniteQueryConfig<
157+
infer TData,
158+
infer TError,
159+
infer TQueryKey,
160+
infer TPageParam
161+
>
162+
? TInferValue extends 'config'
163+
? T
164+
: TInferValue extends 'data'
165+
? TData
166+
: TInferValue extends 'key'
167+
? TQueryKey
168+
: TInferValue extends 'page-param'
169+
? TPageParam
170+
: TInferValue extends 'error'
171+
? TError
172+
: TInferValue extends 'query'
173+
? MobxInfiniteQuery<TData, TError, TQueryKey, TPageParam>
174+
: never
175+
: T extends MobxInfiniteQuery<
176+
infer TData,
177+
infer TError,
178+
infer TQueryKey,
179+
infer TPageParam
180+
>
181+
? TInferValue extends 'config'
182+
? MobxInfiniteQueryConfig<TData, TError, TQueryKey, TPageParam>
183+
: TInferValue extends 'data'
184+
? TData
185+
: TInferValue extends 'key'
186+
? TQueryKey
187+
: TInferValue extends 'page-param'
188+
? TPageParam
189+
: TInferValue extends 'error'
190+
? TError
191+
: TInferValue extends 'query'
192+
? T
193+
: never
194+
: never;

src/mobx-mutation.types.ts

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
} from '@tanstack/query-core';
66
import { IDisposer } from 'disposer-util';
77

8-
import type { MobxMutation } from './mobx-mutation';
8+
import { MobxMutation } from './mobx-mutation';
99
import { MobxQueryClient } from './mobx-query-client';
1010

1111
export interface MobxMutationFeatures {
@@ -42,3 +42,64 @@ export interface MobxMutationConfig<
4242
mutation: MobxMutation<TData, TVariables, TError, TContext>,
4343
) => void;
4444
}
45+
46+
export type MobxMutationConfigFromFn<
47+
T extends (...args: any[]) => any,
48+
TError = DefaultError,
49+
TContext = unknown,
50+
> = MobxMutationConfig<
51+
ReturnType<T> extends Promise<infer TData> ? TData : ReturnType<T>,
52+
Parameters<T>,
53+
TError,
54+
TContext
55+
>;
56+
57+
export type InferMutation<
58+
T extends MobxMutationConfig | MobxMutation,
59+
TInferValue extends
60+
| 'data'
61+
| 'variables'
62+
| 'error'
63+
| 'context'
64+
| 'mutation'
65+
| 'config',
66+
> =
67+
T extends MobxMutationConfig<
68+
infer TData,
69+
infer TVariables,
70+
infer TError,
71+
infer TContext
72+
>
73+
? TInferValue extends 'config'
74+
? T
75+
: TInferValue extends 'data'
76+
? TData
77+
: TInferValue extends 'variables'
78+
? TVariables
79+
: TInferValue extends 'error'
80+
? TError
81+
: TInferValue extends 'context'
82+
? TContext
83+
: TInferValue extends 'mutation'
84+
? MobxMutation<TData, TVariables, TError, TContext>
85+
: never
86+
: T extends MobxMutation<
87+
infer TData,
88+
infer TVariables,
89+
infer TError,
90+
infer TContext
91+
>
92+
? TInferValue extends 'config'
93+
? MobxMutationConfig<TData, TVariables, TError, TContext>
94+
: TInferValue extends 'data'
95+
? TData
96+
: TInferValue extends 'variables'
97+
? TVariables
98+
: TInferValue extends 'error'
99+
? TError
100+
: TInferValue extends 'context'
101+
? TContext
102+
: TInferValue extends 'mutation'
103+
? T
104+
: never
105+
: never;

src/mobx-query.types.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,16 @@ export interface MobxQueryFeatures {
6868
enableOnDemand?: boolean;
6969
}
7070

71+
export type MobxQueryConfigFromFn<
72+
T extends (...args: any[]) => any,
73+
TError = DefaultError,
74+
TQueryKey extends QueryKey = QueryKey,
75+
> = MobxQueryConfig<
76+
ReturnType<T> extends Promise<infer TData> ? TData : ReturnType<T>,
77+
TError,
78+
TQueryKey
79+
>;
80+
7181
export interface MobxQueryConfig<
7282
TData,
7383
TError = DefaultError,
@@ -109,3 +119,33 @@ export interface MobxQueryConfig<
109119
>,
110120
) => MobxQueryDynamicOptions<TData, TError, TQueryKey>;
111121
}
122+
123+
export type InferQuery<
124+
T extends MobxQueryConfig<any, any, any> | MobxQuery<any, any, any>,
125+
TInferValue extends 'data' | 'key' | 'error' | 'query' | 'config',
126+
> =
127+
T extends MobxQueryConfig<infer TData, infer TError, infer TQueryKey>
128+
? TInferValue extends 'config'
129+
? T
130+
: TInferValue extends 'data'
131+
? TData
132+
: TInferValue extends 'key'
133+
? TQueryKey
134+
: TInferValue extends 'error'
135+
? TError
136+
: TInferValue extends 'query'
137+
? MobxQuery<TData, TError, TQueryKey>
138+
: never
139+
: T extends MobxQuery<infer TData, infer TError, infer TQueryKey>
140+
? TInferValue extends 'config'
141+
? MobxQueryConfig<TData, TError, TQueryKey>
142+
: TInferValue extends 'data'
143+
? TData
144+
: TInferValue extends 'key'
145+
? TQueryKey
146+
: TInferValue extends 'error'
147+
? TError
148+
: TInferValue extends 'query'
149+
? T
150+
: never
151+
: never;

0 commit comments

Comments
 (0)