microsoft / microsoft/TypeScript
Unsound calls allowed on a function coming from a deferred indexed access when intersection is involved
Nobody has claimed this yet.
- Dominant language
- Go
- Stars
- 111k
- Forks
- 14.4k
- Avg merge
- 1d 19h
- Merged PRs (30d)
- 117
Description
Bug Report
🔎 Search Terms
deferred index access unsound call union intersection
🕗 Version & Regression Information
- This is the behavior in every version I tried
⏯ Playground Link
Playground link with relevant code
💻 Code
type A = {
type: "A";
value: string;
};
type B = {
type: "B";
value: number;
};
type Message = A | B;
export function handle<M extends Message>(callbacks: {
[K in M["type"]]: (msg: (M & { type: K })["value"]) => unknown;
}) {
window.addEventListener("message", (event) => {
const msg = event.data as M;
// should be an error because it's too permissive
callbacks[msg.type as keyof typeof callbacks](msg.value);
// one or the other must be wrong here
callbacks[msg.type as keyof typeof callbacks]("");
callbacks[msg.type as keyof typeof callbacks](100);
});
}
🙁 Actual behavior
There is no error even though it should be based on Ander's comment here. Note that the comment is about a different variant of this signature, one using Extract. Both the Extract and intersection variants are essentially the same though - one errors today and one doesn't.
🙂 Expected behavior
I would expect to get an error here, just like in the Extract-based variant (TS playground)
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the linked TypeScript Playground reproductions and compare the intersection-based signature with the Extract-based variant. Determine why the two calls accepting "" and 100 receive no error in one version, then add a regression test and ensure the unsound calls are rejected.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- compilers
- Issue type
- Bug
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 25/100