Microsoft/TypeScript

Generic type comparison results in incorrect error when inferring from undefined type

Open

#57,203 opened on Jan 28, 2024

View on GitHub
 (2 comments) (1 reaction) (0 assignees)TypeScript (6,726 forks)batch import
Domain: Error MessagesHelp WantedPossible Improvement

Repository metrics

Stars
 (48,455 stars)
PR merge metrics
 (Avg merge 6d 17h) (9 merged PRs in 30d)

Description

🔎 Search Terms

"generics", "infer undefined type", "not assignable"

🕗 Version & Regression Information

  • This changed between versions 3.6.3 and 3.7.5

⏯ Playground Link

https://www.typescriptlang.org/play?ts=5.4.0-dev.20240128#code/C4TwDgpgBA4hB2EBOBLAxgHgCoD4oF4oBvAKCnKgHpKoBJeANwEMAbFAEy3GhQGcp4Ae2BR2EAGYpE7MhQAeALihYoEOcATt+9Zm07cMU8cigBlPAH4zUJQAYSAXxIlqUAMKCkSCGhEAjCAALJgYUQQBXJAUXGgBROSZfFhAoAFsmYDRAqQBzKByEZHQoUEgoAHdPAGt+NE9vJJASOvheETqvH2AARiU4RFRMeHDUgKQ8QiIHKCZ+fqKhkbGcGKgAOUF4AFp0zOz4PIKB4tLob15wlmB+KVUvTygACjVIXwh2AEpmzbaoDobgAAmPqFQYYYajZATYjTWawUHoDBtVAHFarACqiDkrw07CgAWCoU8qwAsp5oLxXihJGh8gjaacoOdLtcoLcmBUICgkHjkEhPNFXFwygByeZggAsgJwIrZ-CEIlmvBQOXgTD8LGgwEEJW4UDF9PBSyhIoAdKtlHqRRCxrK+AJhDNeMrVerNSUdYyRVKzd9WiIpLoOCDjotIeMCDCnfDQxgpTggA

💻 Code

type Generic<T> = {
    // In this scenario, "InvalidType" is not defined
    x: T extends InvalidType<infer S> ? S : 0
}

// Correct behaviour:
// Exactly matching generic type works correctly
const correct1: Generic<number> = {} as Generic<number>
// Non-matching generic type results in error (expected)
const correct2: Generic<number> = {} as Generic<string>

// Unexpected behavior
// More specific generic type results in a weird error:
// Type 'Generic<42>' is not assignable to type 'Generic<number>'.
//  Type 'number' is not assignable to type '42'.
const invalid: Generic<number> = {} as Generic<42>

🙁 Actual behavior

TS error:

Type 'Generic<42>' is not assignable to type 'Generic<number>'.
  Type 'number' is not assignable to type '42'.

🙂 Expected behavior

There should be no TypeScript error, or at least not a confusing error message like that.

It is not clear where the actual error comes from (undefined type InvalidType), and the current error message does not really make sense - to a user it looks like the type comparison (42 -> number) was inverted (number -> 42).

Additional information about the issue

This also seems to happen in more complex scenarios where all involved types are correctly defined but another TS error like Type instantiation is excessively deep and possibly infinite occurs somewhere in the chain.

Contributor guide