Describe the bug
The useMutationState hook doesn’t propagate generic type parameters (TData, TError, TVariables, TContext) into the select callback.
As a result, when filtering by a specific mutationKey, TypeScript doesn’t infer correct types for mutation.state, forcing developers to cast manually.
Your minimal, reproducible example
https://www.typescriptlang.org/play/?#code/FAFwngDgpgBAsgVxAQxASwPYDsDKKQIDOMAvDAORoAmANlOTAD4XRZVpYDmDz5hCAYwFRChHhSgAnSRknkA3MGAcQUgGbJhMAEpROaQqskwA3sAC+S8NBgARKBoQ0QAUWmzSOvQaMwoAD1U2YjMYMJgqB2QnV3dJAC4YDjUpGAAVNxlJRXMYAH50zI9EouylFXVNWER8TFx8KAAeNNtUZE8ELABrLAwAdywAGkK4z3tHZ1LhtIA1ZEk0ZAAjOmIyTp7+ofSAYWxVQI7u3oGAPlNgcJgBfYCQRLS9rAOQJhhOyLUOKCpFK6o2g9Wig3h8HN9fpdwlIsg9Sm8sE4aH9who0DQEJIoHtOvcYIiALZLKQosJojFY3TIQjYOGjZiImjIqFhAwABWihB+iSWGAwdGQWFJMEMqCIiRqqDqeDFhGFADd5osViIHnMFstVqC2OCsD9hfwlgS0CBVFQAIJ4wnEsqWUCQapIKXYADSUDAnipVGwNDA5ukyDAjQ2Jywp0UymelS0kvQ2AA8hA41hCM1ge11scttN4WRxtFJnFpurlVqyPKMNRpk8XkdNmcLlcCU7kwAxLB5RKCsDC5u1V3uzvwFt1N09lkwbCxqBDgAUio1KsIaqVmpEAEpSOc2TJjVzmjW7trPhDzsxHrdDswwV89ZCrtgcIJhKI5wCUEC2sMF6XVekS2uhDDDcUaBA8h6BJuJDbruBhNCGWxnu8WYDMK2ClHOMKyHSWTfquS4rouqzAZeeIXqBrzXjqt4-FBMEYHu8EoWG2r1kKE6PlApp0FQb6Auk6bHrqPzDFhCQjFkCJInhRF-rM+HEdcpHgaRQk0VQdEwDuDFwcGzFIQhqETliICSGAQ7dsKJlmfYNCBhZWDjlceogH0shdHAGCRA5TnhJwAhpGgBIzok1okhOAD6nwFmaQ68vyUCCr2XHID5Bo3NAaUWEokQCHZWIwMshiSJorx5dSxC6ASGCKiqjbhAAxBACyKqowr+YFwWhQgRLhf8IimRgYCzuuiQVtQwrNRgqgCGaIoCAAFj8ThQAA4gII1jZW97hFNM1zQgEDvmtAVBVAs56n062dVA3W9cYVEnneo0wONO1hHtUCzT81wCpI11nRgSCba922TTI+0-UVpmlZOSZ1MgNBVTV50vW9OQ5V9+WwOVojDv2WBpm0dahjmox5lEMRTP+CkiCT2a7KpmZsecdxQMEXjVbVdD1WETUtagUAGg0Eojo+DREygZO4TTslAYzFHhhx8PYMu+POlgibJqmLRfhJsjFrT8vkS8StXFiyDelgvowH2GsAJJUHdNrCiBxWCCAsiziBXycF2jnrgaXFa3UhCzhgKspqLBMh6rkvINLBuy7+xsQSApxo2DE6cFxtspSD3ZqRCwqW1Q8ZLFykjylI4cV1I1fid2mcTcZUBc1A5eVw3tdd1I-tgM370wJ931UHDyaI8j1cg+jE4gegiKo4k2mMXpLPCgEX1IOdP6AYRKcvSvum6ygSt2hUkgaDGYtYK26JGCEE4APQAFQvxOMAv-AqCLbbN8wF0d0fh-ClV9B-F+T8JwBFKnFPkAp2JXFfu-K4n8YD2ywHlBAkQ-4E2IASH+C0OCcBgCAQhxBmo-DQAIQWMA1CdFmnUcBkCrgUPYNQ1Qc47bJmjhrRo3Zhj8MKo5DOW4YDxXgcKJB4C0EYIxNgrhodbYEKISQshOCNYAPdEwicCiBzmR4cmMcki37SLvs4VISwPS6KwCKfARBtFXFFAQQgQ5YzSjsXKbK9obBuPFoLWOKZmi6H4M4Twvj6iC3OGQUIqJ75SBcQYuoZiH5BzoLNThN9EnYE0mkYJMQcgRlytjX6FUYAAEUEBSDADsGgaB2avDMHaIp8xYB0Iwcmd4XJwkylUEEkQMQwk3x6VAU44dI4JPVsmYZASdZ5OcKcYYABHSpZkal1OeEOCpVS1n1Jev6EqQZcn9PmRGN2rw1B8g6F0oZEsJzdIliYCI-FipEIANoAF0YDmGGI8m4kRnYkjzqIZAOdEgvK4F8n5SQnb4h6jaL5pxgCjMeV8cxkg1aPOsWORIrzyAuhcAATXIJ875IooBpLxLOR5TjYDmE0jSr564P4oJZaytlbKn5PxgAAPTyEAA
Steps to reproduce
import { useMutationState } from '@tanstack/react-query'
type MyData = { data: string[] }
type MyError = { code: number; message: string }
type MyVars = { id: number }
const result = useMutationState<
MutationState<MyData, MyError, MyVars>
>({
filters: { mutationKey: ['KEY'] },
select: ({ state }) => state,
})
// Type '({ state }: Mutation<unknown, Error, unknown, unknown>) => MutationState<unknown, Error, unknown, unknown>' is not assignable to type '(mutation: Mutation<unknown, Error, unknown, unknown>) => MutationState<{ data: string[]; }, { code: number; message: string; }, { id: number; }, unknown>'.
Expected behavior
When using filters.mutationKey to target a known mutation, the generic arguments should be propagated to the select callback:
select: (mutation: Mutation<MyData, MyError, MyVars>) => mutation.state
Current workaround - explicitly casting inside select:
select: (mutation) =>
mutation.state as MutationState<MyData, MyError, MyVars>
How often does this bug happen?
None
Screenshots or Videos
No response
Platform
All
Tanstack Query adapter
react-query
TanStack Query version
v5.59.15
TypeScript version
v5.9.3
Additional context
No response
Describe the bug
The useMutationState hook doesn’t propagate generic type parameters (TData, TError, TVariables, TContext) into the select callback.
As a result, when filtering by a specific mutationKey, TypeScript doesn’t infer correct types for mutation.state, forcing developers to cast manually.
Your minimal, reproducible example
https://www.typescriptlang.org/play/?#code/FAFwngDgpgBAsgVxAQxASwPYDsDKKQIDOMAvDAORoAmANlOTAD4XRZVpYDmDz5hCAYwFRChHhSgAnSRknkA3MGAcQUgGbJhMAEpROaQqskwA3sAC+S8NBgARKBoQ0QAUWmzSOvQaMwoAD1U2YjMYMJgqB2QnV3dJAC4YDjUpGAAVNxlJRXMYAH50zI9EouylFXVNWER8TFx8KAAeNNtUZE8ELABrLAwAdywAGkK4z3tHZ1LhtIA1ZEk0ZAAjOmIyTp7+ofSAYWxVQI7u3oGAPlNgcJgBfYCQRLS9rAOQJhhOyLUOKCpFK6o2g9Wig3h8HN9fpdwlIsg9Sm8sE4aH9who0DQEJIoHtOvcYIiALZLKQosJojFY3TIQjYOGjZiImjIqFhAwABWihB+iSWGAwdGQWFJMEMqCIiRqqDqeDFhGFADd5osViIHnMFstVqC2OCsD9hfwlgS0CBVFQAIJ4wnEsqWUCQapIKXYADSUDAnipVGwNDA5ukyDAjQ2Jywp0UymelS0kvQ2AA8hA41hCM1ge11scttN4WRxtFJnFpurlVqyPKMNRpk8XkdNmcLlcCU7kwAxLB5RKCsDC5u1V3uzvwFt1N09lkwbCxqBDgAUio1KsIaqVmpEAEpSOc2TJjVzmjW7trPhDzsxHrdDswwV89ZCrtgcIJhKI5wCUEC2sMF6XVekS2uhDDDcUaBA8h6BJuJDbruBhNCGWxnu8WYDMK2ClHOMKyHSWTfquS4rouqzAZeeIXqBrzXjqt4-FBMEYHu8EoWG2r1kKE6PlApp0FQb6Auk6bHrqPzDFhCQjFkCJInhRF-rM+HEdcpHgaRQk0VQdEwDuDFwcGzFIQhqETliICSGAQ7dsKJlmfYNCBhZWDjlceogH0shdHAGCRA5TnhJwAhpGgBIzok1okhOAD6nwFmaQ68vyUCCr2XHID5Bo3NAaUWEokQCHZWIwMshiSJorx5dSxC6ASGCKiqjbhAAxBACyKqowr+YFwWhQgRLhf8IimRgYCzuuiQVtQwrNRgqgCGaIoCAAFj8ThQAA4gII1jZW97hFNM1zQgEDvmtAVBVAs56n062dVA3W9cYVEnneo0wONO1hHtUCzT81wCpI11nRgSCba922TTI+0-UVpmlZOSZ1MgNBVTV50vW9OQ5V9+WwOVojDv2WBpm0dahjmox5lEMRTP+CkiCT2a7KpmZsecdxQMEXjVbVdD1WETUtagUAGg0Eojo+DREygZO4TTslAYzFHhhx8PYMu+POlgibJqmLRfhJsjFrT8vkS8StXFiyDelgvowH2GsAJJUHdNrCiBxWCCAsiziBXycF2jnrgaXFa3UhCzhgKspqLBMh6rkvINLBuy7+xsQSApxo2DE6cFxtspSD3ZqRCwqW1Q8ZLFykjylI4cV1I1fid2mcTcZUBc1A5eVw3tdd1I-tgM370wJ931UHDyaI8j1cg+jE4gegiKo4k2mMXpLPCgEX1IOdP6AYRKcvSvum6ygSt2hUkgaDGYtYK26JGCEE4APQAFQvxOMAv-AqCLbbN8wF0d0fh-ClV9B-F+T8JwBFKnFPkAp2JXFfu-K4n8YD2ywHlBAkQ-4E2IASH+C0OCcBgCAQhxBmo-DQAIQWMA1CdFmnUcBkCrgUPYNQ1Qc47bJmjhrRo3Zhj8MKo5DOW4YDxXgcKJB4C0EYIxNgrhodbYEKISQshOCNYAPdEwicCiBzmR4cmMcki37SLvs4VISwPS6KwCKfARBtFXFFAQQgQ5YzSjsXKbK9obBuPFoLWOKZmi6H4M4Twvj6iC3OGQUIqJ75SBcQYuoZiH5BzoLNThN9EnYE0mkYJMQcgRlytjX6FUYAAEUEBSDADsGgaB2avDMHaIp8xYB0Iwcmd4XJwkylUEEkQMQwk3x6VAU44dI4JPVsmYZASdZ5OcKcYYABHSpZkal1OeEOCpVS1n1Jev6EqQZcn9PmRGN2rw1B8g6F0oZEsJzdIliYCI-FipEIANoAF0YDmGGI8m4kRnYkjzqIZAOdEgvK4F8n5SQnb4h6jaL5pxgCjMeV8cxkg1aPOsWORIrzyAuhcAATXIJ875IooBpLxLOR5TjYDmE0jSr564P4oJZaytlbKn5PxgAAPTyEAA
Steps to reproduce
Expected behavior
When using
filters.mutationKeyto target a known mutation, the generic arguments should be propagated to theselectcallback:Current workaround - explicitly casting inside select:
How often does this bug happen?
None
Screenshots or Videos
No response
Platform
All
Tanstack Query adapter
react-query
TanStack Query version
v5.59.15
TypeScript version
v5.9.3
Additional context
No response