Skip to content

Extract breaks when upgrading to TypeScript 5.1 #54680

Closed
@ysulyma

Description

@ysulyma

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

https://typescript-eslint.io/play/#ts=5.1.3&sourceType=module&code=C4TwDgpgBAglC8UDeAoKVSQFxQEQ1wG40oA3AQwBsBXCHAZ2ACcBLAOwHNiBfYlTaACEEyEgJy5BREhRp0obagFsARhCY8+AqAFkI9euQ7REcAD5RBfCAA8wAeybAoAM2psAxsBb22UABbkbAAmlBAAPDpQtsAQIfS6+obGAHwAFB5UlCrkHgDW9Dio6ADaANJQ7LoluAK4ALr1OGlK9Bw4AKI2zLnAkQA0yBjg8hXcKTWytA0AlAgpUO55bPYA7mw8c8VQq+zBawB05MHBHaRxwAAyLIxx6mm4SklGELiDaRDnbMBz8Avb6A8vkYUFaHBEnwuB2C5GA5Cg5ASOmI6EBWRy+XoJTBB20iKgeQgIHsLmGkBJUEylGyuQK9RabQOUwgMxRUG4rJQ3BQQA&eslintrc=N4KABGBEBOCuA2BTAzpAXGYBfEWg&tsconfig=N4KABGBEDGD2C2AHAlgGwKYCcDyiAuysAdgM6QBcYoEEkJemy0eAcgK6qoDCAFutAGsylBm3TgwAXxCSgA

💻 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

No one assigned

    Labels

    Working as IntendedThe behavior described is the intended behavior; this is not a bug

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions