microsoft / microsoft/TypeScript
Explicit `never` return type in `catch` block & condition in `finally` marks the whole `finally` block as unreachable
- 主要语言
- Go
- 星标
- 111k
- 派生
- 14.3k
- 平均合并
- 2 天 4 小时
- 30 天内合并 PR
- 132
描述
### 🔎 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
```ts
function report(e): never {
throw e;
};
const foo = async (): Promise => {
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.
贡献指南
调研方向
在链接的 TypeScript Playground 中重现该诊断,并比较所述版本之间的行为,尤其是 3.6 和 3.7。阅读相关 issue #61259,并跟踪 catch 和 finally 块的控制流处理;当示例能够在保留显式 never 返回类型的同时无 TS7027 构建时,即表示完成。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- typescript
- 领域
- compilers
- Issue 类型
- 缺陷
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 停滞
- 描述清晰度
- 描述清楚
- 新手友好度
- 48/100