Closed
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.