Microsoft/TypeScript

Case for inference failure in `T extends F<T>`

Open

#51.377 geöffnet am 1. Nov. 2022

Auf GitHub ansehen
 (5 Kommentare) (0 Reaktionen) (0 zugewiesene Personen)TypeScript (6.726 Forks)batch import
Experience EnhancementHelp WantedSuggestion

Repository-Metriken

Stars
 (48.455 Stars)
PR-Merge-Metriken
 (Durchschn. Merge 6T 17h) (9 gemergte PRs in 30 T)

Beschreibung

Bug Report

🔎 Search Terms

circular type parameter constraint

Related issues: #40439 #30134

🕗 Version & Regression Information

Tested with 4.8.4

⏯ Playground Link

Playground

💻 Code

declare const f:
  <T extends F<T>>(t: T) => T

type F<T> =
  { a: unknown
  , b: (a: T extends { a: infer X } ? X : never) => unknown
  }

f({
  a: "hello",
  b: x => x.toUpperCase()
})
// doesn't compile because infers `x` as `unknown` instead of `string`

f({
  a: "hello",
  b: (x: string) => x.toUpperCase()
})
// compiles

Note that there is a workaround but it's only a workaround for this minimal case and not for the real world case from which this minimal case was derived.

🙁 Actual behavior

x in the first f call gets inferred as unknown

🙂 Expected behavior

x in the first f call should get inferred as string

Contributor Guide