microsoft / microsoft/TypeScript

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

Open
#62,234 0 comments 1 reaction 1 assignee Claimed by @ahejlsberg View on GitHub
Needs Investigation
Dominant language
Go
Stars
111k
Forks
14.3k
Avg merge
2d 4h
Merged PRs (30d)
132

Description

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

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.