条件表达式会产生奇怪的行为.
示例:
const value = false
const result = value ? 1 : 2 // <-- result is 1 | 2, not 2
我的问题是,为什么在TypeScrip中条件表达式类型总是求值为两者的并集
条件表达式会产生奇怪的行为.
示例:
const value = false
const result = value ? 1 : 2 // <-- result is 1 | 2, not 2
我的问题是,为什么在TypeScrip中条件表达式类型总是求值为两者的并集
这种行为被认为是故意的,正如在microsoft/TypeScript#14206中提到的那样.在microsoft/TypeScript#39995和microsoft/TypeScript#43040中,改变这类行为的相关建议目前被标记为"等待更多反馈",这意味着如果你足够关心这个改变,你可能想要go 描述你的用例,为什么它是令人信服的,为什么现有的变通方法不够充分.我认为这不会有太大影响,但可能不会.
为了使false ? 1 : 2
被认为是类型2
,编译器需要对conditional/ternary operator表达式内部的可达性执行control flow analysis.
不执行这样的分析,因此编译器假设条件表达式的两个分支都是可到达的,因此表达式的类型始终是每个表达式中的union个类型.
对条件statements执行控制流分析,尽管您得到的是可达性错误,而不是缩小范围:
function foo() { // still returns 1 | 2, but:
if (false) {
return 1; // error! Unreachable code detected!
} else {
return 2;
}
}
但同样,这不会发生在条件表达式中.你的问题是:为什么?
您希望在这里看到的控制流分析并不是免费的;它会对代码库中的每个条件表达式施加一定程度的性能损失.因此,问题是:人们多久编写一次x ? y : z
形式的真实世界代码,其中x
在编译时已知为truthy或falsy,添加额外的分析是否足够频繁?
在微软/TypeScrip#39995中,TS团队成员says
一些用例不仅仅是没有人会合理编写的代码(例如,
true ? x : y
或其类似功能),这将是很好的动机.对known到true
或false
的值进行运算的情况相对较少.
因此,权威的答案似乎是,TS团队认为这种代码既不常见也不合理,因此不值得添加额外的控制流分析来处理它.
同样,如果您有不同的感觉并希望看到这种更改,您可能希望转到相关的GitHub问题并解释原因,包括一个令人信服的理由,说明为什么有人可能合理地编写这样的代码,特别是如果您可以找到现有代码库的示例,这些代码足够使用这些代码,值得增加编译时间.但我再说一次,我不会让你对看到这一点真正改变抱有太大希望,因为有很多长期开放的功能请求,比那些具有更多的社区参与.哦,好吧.至少现在你知道为什么会是这样了.