Misleading EPC error on deferred generic type when assigning any object literal, but empty object is also not assignable
#56,391 opened on Nov 14, 2023
Repository metrics
- Stars
- (48,455 stars)
- PR merge metrics
- (Avg merge 6d 17h) (9 merged PRs in 30d)
Description
🔎 Search Terms
N/A (bug report forked from #56388)
🕗 Version & Regression Information
- This is the behavior in every version I tried
⏯ Playground Link
💻 Code
type S = {x: 'abc'}
function f<T extends S>() {
const x: {[k in T['x']]: number} = {abc: 1} // EPC error, for any imaginable key
const y: {[k in T['x']]: number} = {} // ...but this is also a (correct!) type error
}
🙁 Actual behavior
EPC diagnostic on any non-empty object literal, but {} is also not assignable.
🙂 Expected behavior
No EPC diagnostic; should just be a straight assignability failure.
Additional information about the issue
Producing an EPC (excess property check) error for any non-empty object literal here is misleading since that ultimately implies {} would be a legal value (it is not). 5.3 exacerbates this because it removes the "X is not assignable to Y" text from EPC diagnostics, which further implies that the value would be legal if assigned indirectly (also not true; the type is generic and might have other properties).