Microsoft/TypeScript

Exhaustive switch case with returns can mark a finally block as unreachable

Open

#61.259 geöffnet am 24. Feb. 2025

Auf GitHub ansehen
 (0 Kommentare) (1 Reaktion) (0 zugewiesene Personen)TypeScript (6.726 Forks)batch import
BugDomain: check: Control FlowHelp Wanted

Repository-Metriken

Stars
 (48.455 Stars)
PR-Merge-Metriken
 (Durchschn. Merge 6T 17h) (9 gemergte PRs in 30 T)

Beschreibung

🔎 Search Terms

finally switch exhaustive unreachable

🕗 Version & Regression Information

This is the behavior in every version I tried ( doesn't typecheck pre 3.7 ), and I reviewed the FAQ for entries about unreachable code

⏯ Playground Link

https://www.typescriptlang.org/play/?#code/MYewdgzgLgBAhjAvDAFANwFwwIwwD4wBMAlEgHwwDeAUDDFAE4CeVtdMEA7gJZTAAWqNKRrt2wOBACmOLAylQArgzAw0bMROlE5C5avViAvmyMwAZtzBwANjZajx4CCBtSAdDZABzFAHIpAA9eP2JTahNqUEhYACMkISwwRQBbWKkGUkQKR0YHDQ4ePkF0EQK6LRlsXSUVNXKYABMpczhFGyga-XrjUwsrW3tWTWdXDy9fAOCoUPDI6OgYYAT0LFwCEnJh+mZtui5eASEysQrJKq66w1PKnRh5WoMCkzozS2s7fLFuc1RGRSkJxuozcnh8-iCITCvVeEWoUWcsEaK0wMGSaQyWRybDye0KhxKwjxZ201XueiuDWarXanXJjx67BeMDeA0+eJ+fwYAKBI0gYzBk0hM2hTLmQA

💻 Code

const c = (v: 1 | 2) => {
  try {
    switch (v) {
      case 1: return v
      case 2: return v
    }
  } finally {
    if (true) {
      console.log('exit')
    }
  }
}

🙁 Actual behavior

The contents of the finally blocked are marked as unreachable

🙂 Expected behavior

That they are reachable

Additional information about the issue

While the example seems to include some confusing additions the replication apparently requires:

  • The cases to be exhaustive
  • No default case
  • For the switch expression be typed as a literal union of some form
  • An if statement to be in the finally block

I assume this is a chaotic mix of unreachable patterns upsetting flow analysis. I've also noticed that it you add an unreachable return statement after the switch then the contents of finally become reachable.

Contributor Guide