Hacktoberfest 2026: die Issues, die Maintainer für den Oktober markiert haben – offen und einsteigerfreundlich. Hacktoberfest-Issues durchsuchen

setQueryData updater loses discriminated-union fields when spreading inferred NoInfer data

Offen
#11,794 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Maintainer antworten meist innerhalb von 1 Tag

@boriskozak arbeitet bereits daran.

Seit 04.10.2026.

  • #11914 von @iosayin — offen
  • #11915 von @boriskozak — offen

Bewertung

Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Anfängerfreundlichkeit
68/100
Issue-Typ
Bug
Klarheit
Klar beschrieben
Aktivitätsstatus
Aktiv
Tech-Stack
typescript
Bereich
api

Rechercherichtung

Start with the minimal reproduction and the QueryClient.setQueryData and queryOptions entry points, focusing on how the updater parameter uses NoInfer. Run the provided TypeScript command before and after changes. Done means the unannotated updater compiles, preserves the narrowed discriminated-union fields, and the reverse-inference guard remains intact.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

Describe the bug

With @tanstack/react-query 5.104.0, an updater passed to setQueryData(queryOptions(...).queryKey, updater) fails when it narrows a discriminated union and spreads the narrowed value. The tagged key supplies the correct data type, but the inferred updater parameter is wrapped in NoInfer<Data>. The spread loses the variant-specific fields.

Explicitly annotating the updater parameter as Data | undefined makes the same update compile. This appears related to #11018, but affects the QueryClient cache updater rather than the useQuery result.

Minimal reproduction
import { QueryClient, queryOptions } from '@tanstack/react-query'

type Data =
  | { kind: 'a'; value: number; requiredA: number }
  | { kind: 'b'; value: number; requiredB: number }

const query = queryOptions({
  queryKey: ['example'],
  queryFn: async (): Promise<Data> => ({ kind: 'a', value: 1, requiredA: 1 }),
})
const client = new QueryClient()

// Correctly inferred from the tagged key.
const inferred: Data | undefined = client.getQueryData(query.queryKey)

// Fails with TS2345.
client.setQueryData(query.queryKey, (prev) => {
  if (!prev || prev.kind !== 'a') return prev
  return { ...prev, value: prev.value + 1 }
})

// The same update passes with an explicit parameter annotation.
client.setQueryData(query.queryKey, (prev: Data | undefined) => {
  if (!prev || prev.kind !== 'a') return prev
  return { ...prev, value: prev.value + 1 }
})
Steps to reproduce

Typecheck the example with TypeScript 5.8.3:

tsc --noEmit --strict --skipLibCheck --target es2023 --moduleResolution bundler --module esnext repro.ts

The unannotated updater fails with a return type containing { value: number; kind: "a" | "b" }, missing requiredA and requiredB. The annotated updater compiles.

Expected behavior

After prev.kind !== 'a' returns, spreading prev should preserve kind: 'a' and requiredA. The documented query-options key inference should allow this update without repeating the data type on the parameter.

Versions
  • @tanstack/react-query: 5.104.0
  • @tanstack/query-core: 5.104.0
  • TypeScript: 5.8.3
  • Platform: macOS; compile-time only
Additional context

The reproducer uses no application-specific wrappers, key registration, or casts. The reverse-inference guard should remain intact; this report is about preserving normal union narrowing and spread behavior while retaining that guard.

Vorherrschende Sprache
TypeScript
Sterne
50.4k
Forks
4.2k
Ø Merge
6 Std. 55 Min.
Gemergte PRs (30 T.)
390

Entwicklungsumgebung

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus TanStack/query

Alle Issues in TanStack/query

Ähnliche Issues

Weitere Issues zu TypeScript

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.