From 132659cc7632efc474dfb9b9045b3c02761f6a2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nagy=20M=C3=A1t=C3=A9?= Date: Thu, 18 Dec 2025 21:42:58 +0100 Subject: [PATCH 1/4] Speed up type checking by explicitly annotating some type parameters variances --- .../core/buildMiddleware/cacheLifecycle.ts | 13 +++-- .../core/buildMiddleware/queryLifecycle.ts | 4 +- .../toolkit/src/query/endpointDefinitions.ts | 55 ++++++++++--------- 3 files changed, 39 insertions(+), 33 deletions(-) diff --git a/packages/toolkit/src/query/core/buildMiddleware/cacheLifecycle.ts b/packages/toolkit/src/query/core/buildMiddleware/cacheLifecycle.ts index 012d28a361..e6f4805b01 100644 --- a/packages/toolkit/src/query/core/buildMiddleware/cacheLifecycle.ts +++ b/packages/toolkit/src/query/core/buildMiddleware/cacheLifecycle.ts @@ -89,7 +89,10 @@ type LifecycleApi = { requestId: string } -type CacheLifecyclePromises = { +type CacheLifecyclePromises< + out ResultType = unknown, + out MetaType = unknown, +> = { /** * Promise that will resolve with the first value for this cache key. * This allows you to `await` until an actual value is in cache. @@ -125,10 +128,10 @@ type CacheLifecyclePromises = { } export interface QueryCacheLifecycleApi< - QueryArg, - BaseQuery extends BaseQueryFn, - ResultType, - ReducerPath extends string = string, + in QueryArg, + in BaseQuery extends BaseQueryFn, + out ResultType, + in ReducerPath extends string = string, > extends QueryBaseLifecycleApi, CacheLifecyclePromises> {} diff --git a/packages/toolkit/src/query/core/buildMiddleware/queryLifecycle.ts b/packages/toolkit/src/query/core/buildMiddleware/queryLifecycle.ts index 05580ca175..7606761dd6 100644 --- a/packages/toolkit/src/query/core/buildMiddleware/queryLifecycle.ts +++ b/packages/toolkit/src/query/core/buildMiddleware/queryLifecycle.ts @@ -202,8 +202,8 @@ export type QueryLifecycleMutationExtraOptions< export interface QueryLifecycleApi< QueryArg, BaseQuery extends BaseQueryFn, - ResultType, - ReducerPath extends string = string, + out ResultType, + in ReducerPath extends string = string, > extends QueryBaseLifecycleApi, QueryLifecyclePromises {} diff --git a/packages/toolkit/src/query/endpointDefinitions.ts b/packages/toolkit/src/query/endpointDefinitions.ts index 4c51326024..1d43e90e60 100644 --- a/packages/toolkit/src/query/endpointDefinitions.ts +++ b/packages/toolkit/src/query/endpointDefinitions.ts @@ -65,8 +65,8 @@ export type SchemaFailureConverter = ( export type EndpointDefinitionWithQuery< QueryArg, BaseQuery extends BaseQueryFn, - ResultType, - RawResultType extends BaseQueryResult, + out ResultType, + out RawResultType extends BaseQueryResult, > = { /** * `query` can be a function that returns either a `string` or an `object` which is passed to your `baseQuery`. If you are using [fetchBaseQuery](./fetchBaseQuery), this can return either a `string` or an `object` of properties in `FetchArgs`. If you use your own custom [`baseQuery`](../../rtk-query/usage/customizing-queries), you can customize this behavior to your liking. @@ -566,12 +566,13 @@ type QueryTypes< * @public */ export interface QueryExtraOptions< - TagTypes extends string, - ResultType, - QueryArg, - BaseQuery extends BaseQueryFn, - ReducerPath extends string = string, - RawResultType extends BaseQueryResult = BaseQueryResult, + out TagTypes extends string, + in out ResultType, + in out QueryArg, + out BaseQuery extends BaseQueryFn, + out ReducerPath extends string = string, + out RawResultType extends + BaseQueryResult = BaseQueryResult, > extends CacheLifecycleQueryExtraOptions< ResultType, QueryArg, @@ -872,13 +873,14 @@ export type InfiniteQueryTypes< } export interface InfiniteQueryExtraOptions< - TagTypes extends string, - ResultType, - QueryArg, - PageParam, - BaseQuery extends BaseQueryFn, - ReducerPath extends string = string, - RawResultType extends BaseQueryResult = BaseQueryResult, + out TagTypes extends string, + in out ResultType, + in out QueryArg, + in out PageParam, + out BaseQuery extends BaseQueryFn, + out ReducerPath extends string = string, + out RawResultType extends + BaseQueryResult = BaseQueryResult, > extends CacheLifecycleInfiniteQueryExtraOptions< InfiniteData, QueryArg, @@ -1089,12 +1091,13 @@ type MutationTypes< * @public */ export interface MutationExtraOptions< - TagTypes extends string, - ResultType, - QueryArg, - BaseQuery extends BaseQueryFn, - ReducerPath extends string = string, - RawResultType extends BaseQueryResult = BaseQueryResult, + out TagTypes extends string, + in out ResultType, + in out QueryArg, + out BaseQuery extends BaseQueryFn, + out ReducerPath extends string = string, + out RawResultType extends + BaseQueryResult = BaseQueryResult, > extends CacheLifecycleMutationExtraOptions< ResultType, QueryArg, @@ -1262,11 +1265,11 @@ export function isAnyQueryDefinition( return isQueryDefinition(e) || isInfiniteQueryDefinition(e) } -export type EndpointBuilder< - BaseQuery extends BaseQueryFn, - TagTypes extends string, - ReducerPath extends string, -> = { +export interface EndpointBuilder< + out BaseQuery extends BaseQueryFn, + out TagTypes extends string, + out ReducerPath extends string, +> { /** * An endpoint definition that retrieves data, and may provide tags to the cache. * From be7b4c6ca46fa5f3fc15090196cb345e12549f52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nagy=20M=C3=A1t=C3=A9?= Date: Fri, 19 Dec 2025 09:18:47 +0100 Subject: [PATCH 2/4] Convert MutationBaseLifecycleApi to an interface and add more explicit variance specifiers --- .../src/query/core/buildMiddleware/cacheLifecycle.ts | 6 +++--- .../src/query/core/buildMiddleware/queryLifecycle.ts | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/toolkit/src/query/core/buildMiddleware/cacheLifecycle.ts b/packages/toolkit/src/query/core/buildMiddleware/cacheLifecycle.ts index e6f4805b01..6e6681d215 100644 --- a/packages/toolkit/src/query/core/buildMiddleware/cacheLifecycle.ts +++ b/packages/toolkit/src/query/core/buildMiddleware/cacheLifecycle.ts @@ -51,12 +51,12 @@ export interface QueryBaseLifecycleApi< updateCachedData(updateRecipe: Recipe): PatchCollection } -export type MutationBaseLifecycleApi< +export interface MutationBaseLifecycleApi< QueryArg, BaseQuery extends BaseQueryFn, ResultType, ReducerPath extends string = string, -> = LifecycleApi & { +> extends LifecycleApi { /** * Gets the current value of this cache entry. */ @@ -70,7 +70,7 @@ export type MutationBaseLifecycleApi< > } -type LifecycleApi = { +type LifecycleApi = { /** * The dispatch method for the store */ diff --git a/packages/toolkit/src/query/core/buildMiddleware/queryLifecycle.ts b/packages/toolkit/src/query/core/buildMiddleware/queryLifecycle.ts index 7606761dd6..4ce69805d7 100644 --- a/packages/toolkit/src/query/core/buildMiddleware/queryLifecycle.ts +++ b/packages/toolkit/src/query/core/buildMiddleware/queryLifecycle.ts @@ -200,8 +200,8 @@ export type QueryLifecycleMutationExtraOptions< } export interface QueryLifecycleApi< - QueryArg, - BaseQuery extends BaseQueryFn, + in QueryArg, + in BaseQuery extends BaseQueryFn, out ResultType, in ReducerPath extends string = string, > extends QueryBaseLifecycleApi, From 169ee37f2abc0b774fe014375f1740f044642fc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nagy=20M=C3=A1t=C3=A9?= Date: Fri, 19 Dec 2025 10:48:17 +0100 Subject: [PATCH 3/4] Add variance specifiers to MutationBaseLifecycleApi --- .../src/query/core/buildMiddleware/cacheLifecycle.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/toolkit/src/query/core/buildMiddleware/cacheLifecycle.ts b/packages/toolkit/src/query/core/buildMiddleware/cacheLifecycle.ts index 6e6681d215..dc47989d08 100644 --- a/packages/toolkit/src/query/core/buildMiddleware/cacheLifecycle.ts +++ b/packages/toolkit/src/query/core/buildMiddleware/cacheLifecycle.ts @@ -52,10 +52,10 @@ export interface QueryBaseLifecycleApi< } export interface MutationBaseLifecycleApi< - QueryArg, - BaseQuery extends BaseQueryFn, - ResultType, - ReducerPath extends string = string, + in QueryArg, + in BaseQuery extends BaseQueryFn, + in ResultType, + in ReducerPath extends string = string, > extends LifecycleApi { /** * Gets the current value of this cache entry. From 2ea835e49352f950ea92d68719a39f8b4ffc6cc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nagy=20M=C3=A1t=C3=A9?= Date: Fri, 19 Dec 2025 15:19:45 +0100 Subject: [PATCH 4/4] Export internal interface type for type portability into a namespace named RTKInternalDoNotUse --- packages/toolkit/src/query/index.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/toolkit/src/query/index.ts b/packages/toolkit/src/query/index.ts index d76c95efbf..936e3b23ab 100644 --- a/packages/toolkit/src/query/index.ts +++ b/packages/toolkit/src/query/index.ts @@ -1,6 +1,7 @@ // This must remain here so that the `mangleErrors.cjs` build script // does not have to import this into each source file it rewrites. import { formatProdErrorMessage } from '@reduxjs/toolkit' +import type { MutationBaseLifecycleApi } from './core/buildMiddleware/cacheLifecycle' export type { CombinedState, @@ -104,3 +105,9 @@ export type { } from './tsHelpers' export { NamedSchemaError } from './standardSchema' + +// This is for type portability when using interfaces that we don't want to expose +// interfaces are sometimes preferred over type aliases for faster type inference +export declare namespace RTKInternalDoNotUse { + export { MutationBaseLifecycleApi } +}