Microsoft/TypeScript

Misleading error message for missing properties in types composed of the intersection of certain multiple unions

Open

#53,200 opened on Mar 10, 2023

View on GitHub
 (3 comments) (0 reactions) (0 assignees)TypeScript (6,726 forks)batch import
Experience EnhancementHelp WantedSuggestion

Repository metrics

Stars
 (48,455 stars)
PR merge metrics
 (Avg merge 6d 17h) (9 merged PRs in 30d)

Description

Bug Report

🔎 Search Terms

intersection of union required property error message

🕗 Version & Regression Information

This is the behavior in every version I tried, and I reviewed the FAQ for entries about it

I use the playground and observed the same behavior for versions 4.2 through 4.9

⏯ Playground Link

Playground link with relevant code

💻 Code

type Arg =  (
  | {
      prefLabel?: string;
      showPref: false;
    }
  | {
      prefLabel: string;
      showPref?: true;
    }
) 
& (
    | { other: false; } 
    | { other: true; }
    );


const fn = (thing: Arg) => {};

fn({ showPref: false }); // <<< error on this line

fn({ showPref: false, other: true }); // <<< this is ok

🙁 Actual behavior

I see an error for fn({ showPref: false });:

Argument of type '{ showPref: false; }' is not assignable to parameter of type 'Arg'.
  Type '{ showPref: false; }' is not assignable to type '{ prefLabel: string; showPref?: true | undefined; } & { other: true; }'.
    Property 'prefLabel' is missing in type '{ showPref: false; }' but required in type '{ prefLabel: string; showPref?: true | undefined; }'.(2345)
input.tsx(7, 7): 'prefLabel' is declared here.

This is wrong because actually other is missing. The following line does not produce an error

🙂 Expected behavior

I would expect the error message to refer to the missing required property, not to an irrelevant union member

Contributor guide