-
Notifications
You must be signed in to change notification settings - Fork 12.9k
Description
Bug Report
🔎 Search Terms
variance, methods, generics
NB: I did not search very exhaustively, but I did minimize the examples, so should be pretty easy to review and close as dupe or "by design" or whatever.
🕗 Version & Regression Information
- This is the behavior in every version I tried, and I reviewed the FAQ for entries about
strictFunctionTypes
⏯ Playground Link
Variance checking does not interact correctly with extends
:
Variance checking does not interact correctly with "records with methods" types:
💻 Code
Variance checking does not interact correctly with extends
:
type F<out A, out B> = <X extends A = A>(v: X) => B
const a: F<never, never> = v => v
const b: F<unknown, never> = a
const result: never = b(42) // whoops
Variance checking does not interact correctly with "records with methods" types:
type X<out S> = {
x(s: S): never
}
const a: X<never> = { x: s => s }
const b: X<unknown> = a
const whoops: never = b.x(42)
🙁 Actual behavior
In both cases the typechecker allows me to inhabit never
.
🙂 Expected behavior
The typechecker should reject my incorrect variance annotations (F<out A, ...>
and X<out S>
) and not allow me to inhabit never
.
Incidentally this came to light out of some discussion in the "forall for non-functions" issue here: #17574 (comment), but these things don't really seem materially related.
Related to #48240.