Microsoft/TypeScript

Type narrowing in one case statement does not propagate to the next case

Open

#56,361 建立於 2023年11月10日

在 GitHub 查看
 (10 留言) (5 反應) (0 負責人)TypeScript (6,726 fork)batch import
Domain: check: Control FlowHelp WantedPossible Improvement

倉庫指標

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

描述

🔎 Search Terms

  • Type narrowing
  • Switch statement

🕗 Version & Regression Information

  • This is the behavior in every version I tried, and I reviewed the FAQ for entries about switch statements and type narrowing.

⏯ Playground Link

https://www.typescriptlang.org/play?ts=5.3.0-beta#code/GYVwdgxgLglg9mABMOcAUBDATgcwFyIDOUWMYOiAPouACYCmwZ9tAlIgN4BQivRA7jCgQAFojQkQ9dtz5zEEDIXqJsFALyaaYBkzAs8Pecagiscfon2WAolnNY0rANxcjxxctW4AdMWxQhADqQiJoAEQAHuGsBAD0cYj09nBYiAAqAMoAjAAcAAwALLkEAORqpYgwhIgADnCEhDAARgA2AJ6IpXSMzLSlPu7GfFj0UCBYSOEAguGuQ3K6GCCtUIbD8qPjk4jhAEJzQwC+XCdAA

💻 Code

function foo(arg: string | undefined) {
    switch (true) {
        case arg === undefined:
            throw new Error();

        case arg.startsWith("x"): // error TS18048: 'arg' is possibly 'undefined'.
            return "A";

        default:
            return "B";
    }
}

🙁 Actual behavior

error TS18048: 'arg' is possibly 'undefined'. in the second case.

🙂 Expected behavior

I expect the type to be narrowed to string in the second case statement.

Additional information about the issue

See also #56352. Ping @Andarist.

貢獻者指南