microsoft / microsoft/TypeScript

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

Offen
#62,234 0 Kommentare 1 Reaktion 1 zugewiesene Person Auf GitHub ansehen

@ahejlsberg arbeitet bereits daran.

Seit 20.8.2025.

Needs Investigation
Vorherrschende Sprache
Go
Sterne
111k
Forks
14.3k
Ø Merge
2 T. 4 Std.
Gemergte PRs (30 T.)
132

Beschreibung

### 🔎 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?

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Bewertung

Dieses Issue wurde noch nicht bewertet.

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.