Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 39 additions & 6 deletions packages/react-query/src/useMutationState.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,34 @@ export function useIsMutating(
).length
}

type MutationStateOptions<TResult = MutationState> = {
type MutationStateOptions<
TData = unknown,
TError = unknown,
TVariables = unknown,
TContext = unknown,
TResult = MutationState
> = {
Comment on lines +25 to +31
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== query-core defaults =="
rg -n --type=ts -C2 'export interface MutationState<|export class Mutation<' packages/query-core/src/mutation.ts

echo
echo "== react adapter defaults =="
rg -n --type=ts -C2 'type MutationStateOptions<|function getResult<|export function useMutationState<' packages/react-query/src/useMutationState.ts

Repository: TanStack/query

Length of output: 560


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "=== Full MutationStateOptions signature ==="
sed -n '25,35p' packages/react-query/src/useMutationState.ts

echo
echo "=== Full getResult signature ==="
sed -n '38,60p' packages/react-query/src/useMutationState.ts

echo
echo "=== Full useMutationState signature ==="
sed -n '62,75p' packages/react-query/src/useMutationState.ts

echo
echo "=== Current imports ==="
sed -n '1,15p' packages/react-query/src/useMutationState.ts

Repository: TanStack/query

Length of output: 1543


Default generic parameters regress type precision and break generic composition.

At lines 27, 40, and 64, TError = unknown diverges from query-core's TError = DefaultError, weakening type inference for mutation.state.error in select callbacks.

At lines 30, 43, and 67, TResult = MutationState (bare) is not parameterized. When callers provide TData, TError, TVariables, and TContext generics, they don't flow into the default return shape, breaking type safety for composed usage.

Apply the suggested fix across all three declarations (MutationStateOptions, getResult, useMutationState):

  • Import DefaultError from @tanstack/query-core
  • Change TError default from unknown to DefaultError
  • Change TResult default from MutationState to MutationState<TData, TError, TVariables, TContext>
Suggested type-level fix
 import type {
+  DefaultError,
   Mutation,
   MutationCache,
   MutationFilters,
   MutationState,
   QueryClient,
 } from '@tanstack/query-core'

 type MutationStateOptions<
   TData = unknown,
-  TError = unknown,
+  TError = DefaultError,
   TVariables = unknown,
   TContext = unknown,
-  TResult = MutationState
+  TResult = MutationState<TData, TError, TVariables, TContext>
 > = {
   filters?: MutationFilters
   select?: (
     mutation: Mutation<TData, TError, TVariables, TContext>
   ) => TResult
 }

 function getResult<
   TData = unknown,
-  TError = unknown,
+  TError = DefaultError,
   TVariables = unknown,
   TContext = unknown,
-  TResult = MutationState
+  TResult = MutationState<TData, TError, TVariables, TContext>
 >(
   mutationCache: MutationCache,
   options: MutationStateOptions<
     TData,
     TError,
     TVariables,
     TContext,
     TResult
   >,
 ): Array<TResult> {

 export function useMutationState<
   TData = unknown,
-  TError = unknown,
+  TError = DefaultError,
   TVariables = unknown,
   TContext = unknown,
-  TResult = MutationState
+  TResult = MutationState<TData, TError, TVariables, TContext>
 >(

Also applies to: lines 38–44, 62–68

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/react-query/src/useMutationState.ts` around lines 25 - 31, Update
the generic defaults to preserve type precision: import DefaultError from
"@tanstack/query-core" and change the TError default from unknown to
DefaultError, and change the TResult default from the bare MutationState to a
parameterized MutationState<TData, TError, TVariables, TContext> across the
three declarations mentioned (MutationStateOptions, getResult, and
useMutationState) so that provided TData/TError/TVariables/TContext flow into
the result type and improve inference for mutation.state.error in select
callbacks.

filters?: MutationFilters
select?: (mutation: Mutation) => TResult
select?: (
mutation: Mutation<TData, TError, TVariables, TContext>
) => TResult
}

function getResult<TResult = MutationState>(
function getResult<
TData = unknown,
TError = unknown,
TVariables = unknown,
TContext = unknown,
TResult = MutationState
>(
mutationCache: MutationCache,
options: MutationStateOptions<TResult>,
options: MutationStateOptions<
TData,
TError,
TVariables,
TContext,
TResult
>,
): Array<TResult> {
return mutationCache
.findAll(options.filters)
Expand All @@ -39,13 +59,26 @@ function getResult<TResult = MutationState>(
)
}

export function useMutationState<TResult = MutationState>(
options: MutationStateOptions<TResult> = {},
export function useMutationState<
TData = unknown,
TError = unknown,
TVariables = unknown,
TContext = unknown,
TResult = MutationState
>(
options: MutationStateOptions<
TData,
TError,
TVariables,
TContext,
TResult
> = {},
queryClient?: QueryClient,
): Array<TResult> {
const mutationCache = useQueryClient(queryClient).getMutationCache()
const optionsRef = React.useRef(options)
const result = React.useRef<Array<TResult>>(null)

if (result.current === null) {
result.current = getResult(mutationCache, options)
}
Expand Down
Loading