microsoft / microsoft/TypeScript

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

オープン
#53,200 コメント 3 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

Experience Enhancement Help Wanted Suggestion
主要言語
Go
スター
111k
フォーク
14.4k
平均マージ
1日 19時間
マージ済み PR(30日)
117

説明

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

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

リンクされた TypeScript Playground の再現コードから始め、union の交差を含む 2 つの fn 呼び出しの診断を比較します。コンパイラーが報告する union のメンバーと不足しているプロパティをどのように選択するかを追跡します。完了条件は、2 つ目の呼び出しが引き続き有効なまま、1 つ目の呼び出しで無関係な prefLabel プロパティではなく不足している other プロパティが報告されることです。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
typescript
領域
compilers
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
42/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。