Skip to content

Explicit never return type in catch block & condition in finally marks the whole finally block as unreachable #63004

@d-fischer

Description

@d-fischer

🔎 Search Terms

finally, unreachable, condition, never

🕗 Version & Regression Information

  • This builds fine in 3.2,
  • produces a type error regarding the return type in 3.3 through 3.6,
  • and starting 3.7, including the latest native preview, it produces the unreachable code error

⏯ Playground Link

https://www.typescriptlang.org/play/?noImplicitAny=false&ts=5.9.3#code/MYewdgzgLgBATgUwA4jlAXDAFAzBDMATwEoYBeAPhjAQDcE5zsFjMb7HKYBvAKBhhQAFnBAB3GAgDcvAL4zeoSLABmIEEzwRCYYNlYwACqIC2ASwgIAPGACuJgEYMqXPgKhxCPfgPgIotnBgMADMMgKyMMB4UMBCzKRuvogoaDjE4TCRKmZgeAA2+V5JAmYq2B62LN6+vkoQIPkIAHT5IADmWABEQghCXRk+ET6yclJAA

💻 Code

function report(e): never {
  throw e;
};

const foo = async (): Promise<number> => {
  try {
    return 3;
  } catch (e) {
    report(e);
  } finally {
    if (true) {
      console.log("heh");
    }
  }
};

🙁 Actual behavior

test.ts:11:5 - error TS7027: Unreachable code detected.

11     if (true) {
       ~~~~~~~~~~~
12       console.log("heh");
   ~~~~~~~~~~~~~~~~~~~~~~~~~
13     }
   ~~~~~

test.ts:12:7 - error TS7027: Unreachable code detected.

12       console.log("heh");
         ~~~~~~~~~~~~~~~~~~~

🙂 Expected behavior

Builds fine.

Additional information about the issue

This error vanishes if I do any of the following:

  • Remove the explicit never return type of reportError (although that resurfaces the return type error)
  • Remove the call to reportError entirely, or the whole catch block
  • Remove the if condition from the finally block, but leave in the console.log call

I found a similar issue #61259, but it does not include a catch block, which is integral to the issue here - although the issues might still be related. Similarly to that issue, the finally block also becomes reachable when adding another return to the catch block, but it is itself unreachable.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions