Microsoft/TypeScript

Discriminated union with 11+ items does not handle nullability same as union with <10 items

Open

#62,511 建立於 2025年9月29日

在 GitHub 查看
 (3 留言) (0 反應) (0 負責人)TypeScript (6,726 fork)batch import
BugDomain: check: Big UnionsHelp Wanted

倉庫指標

Star
 (48,455 star)
PR 合併指標
 (平均合併 6天 17小時) (30 天內合併 9 個 PR)

描述

🔎 Search Terms

10 11 union undefined type Nullability narrowing is inconsistent between type discriminated unions of <=10 items and >10 items

🕗 Version & Regression Information

  • This changed between versions 4.2.3 and 4.3.5 (before it would complain about undefined in both cases)

⏯ Playground Link

https://www.typescriptlang.org/play/?ts=5.9.2#code/PTAEFUDsEsHtNAd2gFwBagIyYNSlQKYC2AzqACawFmSwqhoCGk5ANgaJAK6uuMBG0VqgCeoEoyIdGZLjHhJUGADyYADPhTESAKHIEAxnwBOHdvUYBmAFygA3qBQiADgVsAiTO9ABfUAB97Rxc3UHcAJm8-QLl9ADNoSAJyAG4daDiACisAQgA6J1dQAF5SsK8ASjsdUFrQEFAAcitG-DJnWBISaH5WMUbYggSk8ka8zMwADjUAFkmKmrqDeBJYdjzWWABzbMsCkIq0nx09QxMzAgt1WwdC0M8ogKC7j0jfJ9uQj0tHwM-XDwzX7PL5hACswP+9wAbJDggCwgB2OEvMKTFGg9wATgxCM8amBg2GyTSGWy6nydxKZQeVUWtQaADlYKACMZjLBjKBMvxLloubymAA3ODGAD8CzqoGWkFW602O0Y6n2rkOOh8QA

💻 Code

// Union with 11+ items does not handle nullability same as union with <10 items
declare let a3: { type: "1" } | { type: "2" } | undefined;
if(a3!.type === "1"){
    // 'a3' is possibly 'undefined'.(18048)
    console.log(a3.type);
}

declare let a10: { type: "1" } | { type: "2" } | { type: "3" } | { type: "4" } | { type: "5" } | { type: "6" } | { type: "7" } | { type: "8" } | { type: "9" } | { type: "10" } | undefined;
if(a10!.type === "1"){
    // No error (better behavior?)
    console.log(a10.type);
}

🙁 Actual behavior

Complains about undefined for unions with >10 members, but not for unions <11

🙂 Expected behavior

It seems like it should not error in either case - the code inside the if can only execute if the a3 variable is not undefined

Additional information about the issue

Relevant function in checker.ts: getKeyPropertyName(). That is where the 10 magic value comes from.

貢獻者指南