microsoft / microsoft/TypeScript

Regression in some error elaborations involving a target type mixing arrays with non-arrays

未关闭
#62,234 0 条评论 1 个 reaction 已指派 1 人 在 GitHub 查看

@ahejlsberg 已经在做这个了。

开始于 2025年8月20日。

Needs Investigation
主要语言
Go
星标
111k
派生
14.3k
平均合并
2 天 4 小时
30 天内合并 PR
132

描述

### 🔎 Search Terms

discriminated discrimination array error elaboration single

### 🕗 Version & Regression Information

- This changed in PR https://github.com/microsoft/TypeScript/pull/61828

### ⏯ Playground Link

https://www.typescriptlang.org/play/?ts=6.0.0-dev.20250807#code/C4TwDgpgBAyglgOwOYBsIHkBOBBTmCGIAPACoB8UAvFCVAD40DaAugNwBQ7okUAksBAC2VdlHpQA3qLEyAzpgDGALigAiAGYB7Tao4yoAX2kMp+sfOVqARvky7pYgx3YLNCWcCiarAKwCMKvDIaFi4BMT8QhTUplAWKqo2AF6qADTsTpyu7p7ePgBMgYioGDh4hESRghQMAK4IACYQ6ogQDVSS0vHW+CnpmS5uHl6+AMxFwaVhFVXi9U0tCG3RneaKCclpGc7Zw3kALBMloeURAsJ1jc2tDTVQ89dL7TFd6z1921lDnraYAbDFEJlcKVc4rWLdRK9LYDXY-PCFAGTE4gqp3B6LNodRjSWJrSxQj6OdJsL45KC-cZI47AmbnOZXTG3bG4hxxN6ErbE9ikwbk36HalA6ZnIQMhY3dGMm4ssR49kEzbpbm87jQAAymiQcAUlVSUHQKwAFIgwLVgCpeABKKgUdDONV8c75ERiExs-EJLQ6PRmOANFQeTDFX2OYyrMzdTXa3VLABuEEw+vqAGsEJoAO4IMihmT+gD8KnjidzAyaChQtmgcKgKC1OpU0Z1RCDxX1CFqgisiZzZL2vgArEdhadQUJ8uDXpY6zHlVB-QlZJpBBBeA0YTtviMfAA2YdTUdVCfix5Yl6e2v1hRzhdqJcrtcbvu5XwAdn3KLp45PTMnF5nOo3gGd7Lqu679Ju5J5AAHB+tKioILqXBKTxSihZ4Rt0AHXtIt6qPeYFPnywy-EOQoHqizorDicpslhV5zmIeEEY+c4GCSkEkXge7kZ+CHHshp7PFANERv+DFssxoGsdI7E8px8KYO+vHwWOiE-pKspiQqKjYYx87Afh0ngbJHHPhSeCwSpIpqUh9zSqhGlPFp8r0bOkmGSxJkqhwQA

### 💻 Code

```ts
type SingleOrArray = T | T[];

type Item =
| {
src: "foo";
}
| {
src: "bar";
};

const obj1: SingleOrArray = {
src: "baz", // ✅ errors nicely at property
};

// ⚠️ no change but reported error is at suboptimal position
const obj2: SingleOrArray | undefined = {
src: "baz",
};

// ⚠️ no change but reported error is at suboptimal position
const obj3: SingleOrArray = {
src: "baz",
};

// ⚠️ no change but reported error is at suboptimal position
const obj4: SingleOrArray | undefined = {
src: "baz",
};

const arr1: SingleOrArray = {
src: "baz", // ✅ errors nicely at property
};

const arr2: SingleOrArray | undefined = [
{
src: "baz", // ✅ errors nicely at property
},
];

const arr3: SingleOrArray = [
{
src: "baz", // ✅ errors nicely at property
},
];

const arr4: SingleOrArray | undefined = [
{
src: "baz", // ✅ errors nicely at property
},
];

type Logic = (input: I) => O;

type Item2 =
| {
src: "foo";
id: string;
}
| {
src: Logic;
id?: never;
};

declare const logic: Logic;

// ❌ error moved from a property to the variable
const obj5: SingleOrArray = {
src: logic,
id: "someId",
};

// ❌ error moved from a property to the variable
const obj6: SingleOrArray | undefined = {
src: logic,
id: "someId",
};

// ❌ error moved from a property to the variable
const obj7: SingleOrArray = {
src: logic,
id: "someId",
};

// ❌ error moved from a property to the variable
const obj8: SingleOrArray | undefined = {
src: logic,
id: "someId",
};

// ⚠️ no change but reported error is at suboptimal position
const arr5: SingleOrArray = [
{
src: logic,
id: "someId",
},
];

// ⚠️ no change but reported error is at suboptimal position
const arr6: SingleOrArray | undefined = [
{
src: logic,
id: "someId",
},
];

const arr7: SingleOrArray = [
{
src: logic,
id: "someId", // ✅ errors nicely at property
},
];

const arr8: SingleOrArray | undefined = [
{
src: logic,
id: "someId", // ✅ errors nicely at property
},
];
```

### 🙁 Actual behavior

Some of the errors in the "second group" moved. It is a specific situation with multiple available discriminants.

### 🙂 Expected behavior

I'd really expect all of the errors within each "group" to be reported at a property. I especially don't see a reason why `| undefined` would make the error move to one of the parent nodes.

### Additional information about the issue

this was caught here: https://github.com/microsoft/TypeScript/pull/61828#issuecomment-2957137115

1. is this purely an elaboration issue?
2. or could a heuristic be introduced that would allow for array targets to be eliminated early when discriminating by available object members?

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

评估

这个 Issue 还没有评估数据。

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。