microsoft / TypeScript

TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
https://www.typescriptlang.org
Apache License 2.0
98.27k stars 12.21k forks source link

Elementwise elaboration fails to be found for properties mixed with incompatible index signatures using intersections #58344

Open Andarist opened 2 weeks ago

Andarist commented 2 weeks ago

πŸ”Ž Search Terms

elementwise elaboration errors write type index signature intersection

πŸ•— Version & Regression Information

⏯ Playground Link

https://www.typescriptlang.org/play/?ts=5.5.0-dev.20240428#code/MYewdgzgLgBFCm0BcMDeMDaBrF0BOAlmAOYC6KYArgLYBG8eMAvjAGRowBmIIuUhJZjAC8HbrxgAiWgEM8k5gG4AUEA

πŸ’» Code

const test: { [k: string]: number } & { foo: string } = { foo: "bar" };

πŸ™ Actual behavior

test variable gets highlighted

πŸ™‚ Expected behavior

I'd expect foo property in the source to get highlighted

Additional information about the issue

I don't really expect this to get any meaningful priority ;p it's just something interesting that I noticed while investigating some legitimate question as to why an error is not on the property itself in a more complex situation. Such intersections are flawed on principle so πŸ€·β€β™‚οΈ

This happens because elaborateElementwise uses getBestMatchIndexedAccessTypeOrUndefined and that prefers concrete properties on intersections over index signatures. The problem is that you can read such dubious properties from the type (and it has a matching type in the example above so it doesn't become an elementwise candidate) but you can't quite write to them.