Microsoft/TypeScript

Confusing diagnostics with exact optional property types (EOPT)

Open

#56,682 创建于 2023年12月5日

在 GitHub 查看
 (0 评论) (2 反应) (0 负责人)TypeScript (6,726 fork)batch import
BugDomain: flag: exactOptionalPropertyTypesHelp Wanted

仓库指标

Star
 (48,455 star)
PR 合并指标
 (平均合并 6天 17小时) (30 天内合并 9 个 PR)

描述

🔎 Search Terms

EOPT exact optional property types exactOptionalPropertyTypes

🕗 Version & Regression Information

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

⏯ Playground Link

https://www.typescriptlang.org/play?exactOptionalPropertyTypes=true&ts=5.4.0-dev.20231205#code/PTAEAEGcBcCcEsDG0Bco4FcCmAoEEsAPAQ2QHkAHaeAewDtiAbABVhoq1mgE8AVbjpDSZcOHh1ABBUAF5QAb1DEA-GjoYAtgCNOAblBa0MBHQDmAGlAAvVQoC+oO7pw4AZhjrJadUK4AUxGiSAJQKoLBY0BiwPsT6di7+ioGgHgAmWK7wdFhpllZo6ZnZuY7BzviSsKaaWHTQoDSu6AJYoADkyYV0GVk5afHtoPCQoHQ0DcSQkPCmDFqMbdA0oBTEsMQakZyNzeJt7ZJDAO7w0AAWHUSk0JTU9Eys7Jw8-ILCsNjtAHSgAML0GYZWBKNJpbKmDpFPq5IbLdDnJatUZNBFLdamSLtUYUNgcLjwLCQb54MCgJ74ngdLRDEagDQjGZmYY+fYdLqpHrFfqDAwYBoRACOGHgETSLJaEkOPz8ACYAMwAdgAnMEcEA

💻 Code

// @strict: true
// @exactOptionalPropertyTypes: true

type A = { a?: number; b: string, z?: {} };

function f(a: A) { return a; }

f({ a: undefined, z: undefined });
// Argument of type '{ a: undefined; }' is not assignable to parameter of type 'A' with 'exactOptionalPropertyTypes: true'. Consider adding 'undefined' to the types of the target's properties.
//  Property 'b' is missing in type '{ a: undefined; }' but required in type 'A'.(2379)

🙁 Actual behavior

Normally nested diagnostic messages are a refinement of their parents. In this case the inner diagnostic about property b is not related to the EOPT assignability issue in the head message. We have two different errors being represented in the same chain.

🙂 Expected behavior

There are several reasonable behaviors here.

  1. Do not change the parent message to the EOPT flavor when the inner message is not EOPT related
  2. Report two separate diagnostics
  3. Display both the current inner message and the EOPT mismatches at the same level

I would prefer option 2.
I have a working version of option 3 that I can a PR for if you want to go that route ( either as a permanent solution or a stop gap until further work on EOPT is done)

Argument of type '{ a: undefined; z: undefined; }' is not assignable to parameter of type 'A'.
  Properties not assignable with exactOptionalPropertyTypes: a, z
  Property 'b' is missing in type '{ a: undefined; z: undefined; }' but required in type 'A'.ts(2345)

Additional information about the issue

No response

贡献者指南