Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] Typings optimizations #6665

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 2 additions & 2 deletions packages/query-core/src/infiniteQueryBehavior.ts
Expand Up @@ -7,9 +7,9 @@ import type {
QueryKey,
} from './types'

export function infiniteQueryBehavior<TQueryFnData, TError, TData, TPageParam>(
export function infiniteQueryBehavior<TData, TError, TPageParam>(
pages?: number,
): QueryBehavior<TQueryFnData, TError, InfiniteData<TData, TPageParam>> {
): QueryBehavior<InfiniteData<TData, TPageParam>, TError> {
return {
onFetch: (context, query) => {
const fetchFn = async () => {
Expand Down
49 changes: 21 additions & 28 deletions packages/query-core/src/infiniteQueryObserver.ts
Expand Up @@ -23,40 +23,37 @@ type InfiniteQueryObserverListener<TData, TError> = (
) => void

export class InfiniteQueryObserver<
TQueryFnData = unknown,
TData = unknown,
TError = DefaultError,
TData = InfiniteData<TQueryFnData>,
TQueryData = TQueryFnData,
TSelectData = TData,
TQueryKey extends QueryKey = QueryKey,
TPageParam = unknown,
> extends QueryObserver<
TQueryFnData,
InfiniteData<TData, TPageParam>,
TError,
TData,
InfiniteData<TQueryData, TPageParam>,
TSelectData,
TQueryKey
> {
// Type override
subscribe!: (
listener?: InfiniteQueryObserverListener<TData, TError>,
listener?: InfiniteQueryObserverListener<TSelectData, TError>,
) => () => void

// Type override
getCurrentResult!: () => InfiniteQueryObserverResult<TData, TError>
getCurrentResult!: () => InfiniteQueryObserverResult<TSelectData, TError>

// Type override
protected fetch!: (
fetchOptions: ObserverFetchOptions,
) => Promise<InfiniteQueryObserverResult<TData, TError>>
) => Promise<InfiniteQueryObserverResult<TSelectData, TError>>

// eslint-disable-next-line @typescript-eslint/no-useless-constructor
constructor(
client: QueryClient,
options: InfiniteQueryObserverOptions<
TQueryFnData,
TError,
TData,
TQueryData,
TError,
TSelectData,
TQueryKey,
TPageParam
>,
Expand All @@ -72,10 +69,9 @@ export class InfiniteQueryObserver<

setOptions(
options?: InfiniteQueryObserverOptions<
TQueryFnData,
TError,
TData,
TQueryData,
TError,
TSelectData,
TQueryKey,
TPageParam
>,
Expand All @@ -92,24 +88,23 @@ export class InfiniteQueryObserver<

getOptimisticResult(
options: DefaultedInfiniteQueryObserverOptions<
TQueryFnData,
TError,
TData,
TQueryData,
TError,
TSelectData,
TQueryKey,
TPageParam
>,
): InfiniteQueryObserverResult<TData, TError> {
): InfiniteQueryObserverResult<TSelectData, TError> {
options.behavior = infiniteQueryBehavior()
return super.getOptimisticResult(options) as InfiniteQueryObserverResult<
TData,
TSelectData,
TError
>
}

fetchNextPage(
options?: FetchNextPageOptions,
): Promise<InfiniteQueryObserverResult<TData, TError>> {
): Promise<InfiniteQueryObserverResult<TSelectData, TError>> {
return this.fetch({
...options,
meta: {
Expand All @@ -120,7 +115,7 @@ export class InfiniteQueryObserver<

fetchPreviousPage(
options?: FetchPreviousPageOptions,
): Promise<InfiniteQueryObserverResult<TData, TError>> {
): Promise<InfiniteQueryObserverResult<TSelectData, TError>> {
return this.fetch({
...options,
meta: {
Expand All @@ -131,20 +126,18 @@ export class InfiniteQueryObserver<

protected createResult(
query: Query<
TQueryFnData,
InfiniteData<TData, TPageParam>,
TError,
InfiniteData<TQueryData, TPageParam>,
TQueryKey
>,
options: InfiniteQueryObserverOptions<
TQueryFnData,
TError,
TData,
TQueryData,
TError,
TSelectData,
TQueryKey,
TPageParam
>,
): InfiniteQueryObserverResult<TData, TError> {
): InfiniteQueryObserverResult<TSelectData, TError> {
const { state } = query
const result = super.createResult(query, options)

Expand Down
51 changes: 23 additions & 28 deletions packages/query-core/src/query.ts
Expand Up @@ -23,15 +23,14 @@ import type { Retryer } from './retryer'
interface QueryConfig<
TQueryFnData,
TError,
TData,
TQueryKey extends QueryKey = QueryKey,
> {
cache: QueryCache
queryKey: TQueryKey
queryHash: string
options?: QueryOptions<TQueryFnData, TError, TData, TQueryKey>
defaultOptions?: QueryOptions<TQueryFnData, TError, TData, TQueryKey>
state?: QueryState<TData, TError>
options?: QueryOptions<TQueryFnData, TError, TQueryKey>
defaultOptions?: QueryOptions<TQueryFnData, TError, TQueryKey>
state?: QueryState<TQueryFnData, TError>
}

export interface QueryState<TData = unknown, TError = DefaultError> {
Expand All @@ -52,25 +51,23 @@ export interface QueryState<TData = unknown, TError = DefaultError> {
export interface FetchContext<
TQueryFnData,
TError,
TData,
TQueryKey extends QueryKey = QueryKey,
> {
fetchFn: () => unknown | Promise<unknown>
fetchOptions?: FetchOptions
signal: AbortSignal
options: QueryOptions<TQueryFnData, TError, TData, any>
options: QueryOptions<TQueryFnData, TError, any>
queryKey: TQueryKey
state: QueryState<TData, TError>
state: QueryState<TQueryFnData, TError>
}

export interface QueryBehavior<
TQueryFnData = unknown,
TError = DefaultError,
TData = TQueryFnData,
TQueryKey extends QueryKey = QueryKey,
> {
onFetch: (
context: FetchContext<TQueryFnData, TError, TData, TQueryKey>,
context: FetchContext<TQueryFnData, TError, TQueryKey>,
query: Query,
) => void
}
Expand Down Expand Up @@ -144,14 +141,13 @@ export interface SetStateOptions {
// CLASS

export class Query<
TQueryFnData = unknown,
TData = unknown,
TError = DefaultError,
TData = TQueryFnData,
TQueryKey extends QueryKey = QueryKey,
> extends Removable {
queryKey: TQueryKey
queryHash: string
options!: QueryOptions<TQueryFnData, TError, TData, TQueryKey>
options!: QueryOptions<TData, TError, TQueryKey>
state: QueryState<TData, TError>
isFetchingOptimistic?: boolean

Expand All @@ -160,11 +156,11 @@ export class Query<
#cache: QueryCache
#promise?: Promise<TData>
#retryer?: Retryer<TData>
#observers: Array<QueryObserver<any, any, any, any, any>>
#defaultOptions?: QueryOptions<TQueryFnData, TError, TData, TQueryKey>
#observers: Array<QueryObserver<any, any, any, any>>
#defaultOptions?: QueryOptions<TData, TError, TQueryKey>
#abortSignalConsumed: boolean

constructor(config: QueryConfig<TQueryFnData, TError, TData, TQueryKey>) {
constructor(config: QueryConfig<TData, TError, TQueryKey>) {
super()

this.#abortSignalConsumed = false
Expand All @@ -183,7 +179,7 @@ export class Query<
}

#setOptions(
options?: QueryOptions<TQueryFnData, TError, TData, TQueryKey>,
options?: QueryOptions<TData, TError, TQueryKey>,
): void {
this.options = { ...this.#defaultOptions, ...options }

Expand Down Expand Up @@ -281,7 +277,7 @@ export class Query<
this.#retryer?.continue()
}

addObserver(observer: QueryObserver<any, any, any, any, any>): void {
addObserver(observer: QueryObserver<any, any, any, any>): void {
if (!this.#observers.includes(observer)) {
this.#observers.push(observer)

Expand All @@ -292,7 +288,7 @@ export class Query<
}
}

removeObserver(observer: QueryObserver<any, any, any, any, any>): void {
removeObserver(observer: QueryObserver<any, any, any, any>): void {
if (this.#observers.includes(observer)) {
this.#observers = this.#observers.filter((x) => x !== observer)

Expand Down Expand Up @@ -325,7 +321,7 @@ export class Query<
}

fetch(
options?: QueryOptions<TQueryFnData, TError, TData, TQueryKey>,
options?: QueryOptions<TData, TError, TQueryKey>,
fetchOptions?: FetchOptions,
): Promise<TData> {
if (this.state.fetchStatus !== 'idle') {
Expand Down Expand Up @@ -408,7 +404,7 @@ export class Query<

// Trigger behavior hook
const context: Omit<
FetchContext<TQueryFnData, TError, TData, TQueryKey>,
FetchContext<TData, TError, TQueryKey>,
'signal'
> = {
fetchOptions,
Expand All @@ -421,7 +417,7 @@ export class Query<
addSignalProperty(context)

this.options.behavior?.onFetch(
context as FetchContext<TQueryFnData, TError, TData, TQueryKey>,
context as FetchContext<TData, TError, TQueryKey>,
this as unknown as Query,
)

Expand Down Expand Up @@ -449,12 +445,12 @@ export class Query<
// Notify cache callback
this.#cache.config.onError?.(
error as any,
this as Query<any, any, any, any>,
this as Query<any, any, any>,
)
this.#cache.config.onSettled?.(
this.state.data,
error as any,
this as Query<any, any, any, any>,
this as Query<any, any, any>,
)
}

Expand Down Expand Up @@ -483,11 +479,11 @@ export class Query<
this.setData(data)

// Notify cache callback
this.#cache.config.onSuccess?.(data, this as Query<any, any, any, any>)
this.#cache.config.onSuccess?.(data, this as Query<any, any, any>)
this.#cache.config.onSettled?.(
data,
this.state.error as any,
this as Query<any, any, any, any>,
this as Query<any, any, any>,
)

if (!this.isFetchingOptimistic) {
Expand Down Expand Up @@ -609,12 +605,11 @@ export class Query<
}

function getDefaultState<
TQueryFnData,
TError,
TData,
TError,
TQueryKey extends QueryKey,
>(
options: QueryOptions<TQueryFnData, TError, TData, TQueryKey>,
options: QueryOptions<TData, TError, TQueryKey>,
): QueryState<TData, TError> {
const data =
typeof options.initialData === 'function'
Expand Down