Skip to content

Generic functions combining a conditional type and an intersection are not assignable to themselves #51399

@ehmicky

Description

@ehmicky

🔎 Search Terms

"same type assignable"
"Two different types with this name exist, but they are unrelated."

🕗 Version & Regression Information

Please keep and fill in the line that best applies:

  • This is a crash
  • This is the behavior in every version I tried (3.3.3 to nightly), and I reviewed the FAQ for entries about it

⏯ Playground Link

Playground link with relevant code

💻 Code

declare let a: <T>() => (T extends true ? true : false) & boolean
declare let b: <T>() => (T extends true ? true : false) & boolean
a = b

🙁 Actual behavior

This produces the following error message:

Type '<T>() => (T extends true ? true : false) & boolean' is not assignable to 
type '<T>() => (T extends true ? true : false) & boolean'. 
Two different types with this name exist, but they are unrelated.
  Type 'false' is not assignable to type '(T extends true ? true : false) & boolean'.

Also, the following unexpectedly removes the error message:

  • Removing & boolean
  • Replacing T extends true ? true : false by true
  • Replacing T extends true ? true : false by T extends true ? true : true
  • Replacing b's type by typeof a

🙂 Expected behavior

Since the two types are identical, a and b should be assignable to each other.

Metadata

Metadata

Assignees

Labels

BugA bug in TypeScriptFix AvailableA PR has been opened for this issue

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions