microsoft / microsoft/TypeScript

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

Abierto
#62,234 0 comentarios 1 reacción 1 asignado Ver en GitHub

@ahejlsberg ya está trabajando en esto.

Desde el 20/8/2025.

Needs Investigation
Lenguaje dominante
Go
Estrellas
111k
Forks
14.3k
Merge medio
2 d 4 h
PR fusionados (30 d)
132

Descripción

🔎 Search Terms

discriminated discrimination array error elaboration single

🕗 Version & Regression Information
⏯ 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
type SingleOrArray<T> = T | T[];

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

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

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

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

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

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

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

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

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

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

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

declare const logic: Logic<string, number>;

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

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

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

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

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

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

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

const arr8: SingleOrArray<Item2 | undefined> | 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?

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.