Microsoft/TypeScript

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

Open

#51.377 aberto em 1 de nov. de 2022

Ver no GitHub
 (5 comments) (0 reactions) (0 assignees)TypeScript (6.726 forks)batch import
Experience EnhancementHelp WantedSuggestion

Métricas do repositório

Stars
 (48.455 stars)
Métricas de merge de PR
 (Mesclagem média 6d 17h) (9 fundiu PRs em 30d)

Description

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

Guia do colaborador