microsoft / microsoft/TypeScript
Misleading error message for missing properties in types composed of the intersection of certain multiple unions
まだ誰も着手していません。
- 主要言語
- 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
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
リンクされた TypeScript Playground の再現コードから始め、union の交差を含む 2 つの fn 呼び出しの診断を比較します。コンパイラーが報告する union のメンバーと不足しているプロパティをどのように選択するかを追跡します。完了条件は、2 つ目の呼び出しが引き続き有効なまま、1 つ目の呼び出しで無関係な prefLabel プロパティではなく不足している other プロパティが報告されることです。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- typescript
- 領域
- compilers
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 42/100