Microsoft/TypeScript

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

Open

#61.259 aberto em 24 de fev. de 2025

Ver no GitHub
 (0 comments) (1 reaction) (0 assignees)TypeScript (6.726 forks)batch import
BugDomain: check: Control FlowHelp Wanted

Métricas do repositório

Stars
 (48.455 stars)
Métricas de merge de PR
 (Mesclagem média 6d 17h) (9 fundiu PRs em 30d)

Description

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

Guia do colaborador