gpt4 book ai didi

typescript - 为什么 TypeScript 流程分析不覆盖 else block ?

转载 作者:行者123 更新时间:2023-12-02 17:57:50 25 4
gpt4 key购买 nike

让我们考虑以下代码:

function f(x : number) {
if (x === 1) {
if (x === 2) {} // error
}
else {
if (x === 1) {} // OK
}
}

这里,编译器在 x === 2 上给出错误。原因很简单:如果执行已到达此 block ,则当 x === 1 传递时,x 应该为 1。由于 12 没有重叠,因此 x 不可能同时是 12 .

但是编译器对于 else 内的第二个 x === 1 完全没问题。这应该是不可能的,因为 x 已经无法检查 if 语句中的 x === 1。由于 x 无法同时满足 x === 1!(x === 1) 第二个 if > 应该给我与 x === 2 相同的错误。

这怎么可能?这是高级流量分析的某种未实现的功能吗?这是一个错误吗?或者说这个案例有一些隐藏的逻辑,最终确实有一定的意义?

谢谢。

最佳答案

因为 Typescript 无法表达类型,例如数字特定数字。

当你这样做时:

if (x === 1) { x } // x is type: 1

然后它知道该 block 中的x1。这很好,1 是有效且有用的类型。静态地说 1 === 2 永远不可能为真,这是微不足道的。

但在 else block 中:

if (x === 1) { x }
else { x } // x is type: number

那么x就是number类型,因为类型系统无法表达“除了1之外的所有数字”。因此,编译器实际上无法保证代码路径不会被采用,即使您可以看到这一点。


当然,这是类型系统的限制。但 Typescript 并不完美。它是一种建立在不同语言之上的类型系统,这是您必须满足的事情之一。

关于typescript - 为什么 TypeScript 流程分析不覆盖 else block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75240147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com