microsoft / microsoft/TypeScript
Regression in some error elaborations involving a target type mixing arrays with non-arrays
@ahejlsberg arbeitet bereits daran.
Seit 20.8.2025.
- 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
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Bewertung
Dieses Issue wurde noch nicht bewertet.