- 
                Notifications
    You must be signed in to change notification settings 
- Fork 13.1k
Closed
Labels
Working as IntendedThe behavior described is the intended behavior; this is not a bugThe behavior described is the intended behavior; this is not a bug
Description
Bug Report
Some of my code using Extract stopped working when I upgraded from 5.0 to 5.1. This may be related to #54676. I didn't see anything in the release announcement to suggest that this might happen.
🔎 Search Terms
Extract, TypeScript 5.1, discriminated union
🕗 Version & Regression Information
- This changed between versions 5.0.4 and 5.1.3
⏯ Playground Link
💻 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: Extract<M, {type: K}>["value"]) => unknown;
}) {
  window.addEventListener("message", (event) => {
    const msg = event.data as M;
    callbacks[msg.type as keyof typeof callbacks](msg.value);
  });
}🙁 Actual behavior
In TypeScript 5.0, this code works. In TypeScript 5.1, it complains about msg.value, with the error
Argument of type 'string | number' is not assignable to parameter of type 'Extract<M, { type: M["type"]; }>["value"]'.
  Type 'string' is not assignable to type 'Extract<M, { type: M["type"]; }>["value"]'.
    Type 'string' is not assignable to type 'never'.ts(2345)
🙂 Expected behavior
Code should work as it did in 5.0.4. If this is now intended behavior, I would like to know how to fix my code.
Metadata
Metadata
Assignees
Labels
Working as IntendedThe behavior described is the intended behavior; this is not a bugThe behavior described is the intended behavior; this is not a bug