microsoft / microsoft/TypeScript

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

Đang mở
#62,234 0 bình luận 1 reaction 1 người được giao Xem trên GitHub

@ahejlsberg đang làm issue này rồi.

Từ ngày 20/8/2025.

Needs Investigation
Ngôn ngữ chính
Go
Star
111k
Fork
14.3k
Merge trung bình
2 ngày 4 giờ
Pull request đã merge (30 ngày)
132

Mô tả

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

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.