【发布时间】:2012-09-23 12:18:42
【问题描述】:
TypeScript 规范在 §4.15.6 中说明了 && 运算符:
&& 运算符允许操作数为任何类型,并产生与第二个操作数相同类型的结果。
在 Javascript 中,&& 运算符如果为假则返回第一个操作数,否则返回第二个操作数 (see ECMA-262 §11.11)。
这意味着如果左操作数是假的,&& 将返回一个与左操作数类型匹配的值。例如,
typeof ( false && {} ) === "boolean" // true
typeof ( '' && 1 ) === "string" // true
typeof ( null && "hello" ) === "object" // true
typeof ( NaN && true ) === "number" // true
根据上面引用的规则,Typescript 会错误地预测上述表达式的类型分别为Object、Number、String 和Boolean。 p>
我错过了什么吗?是否有充分的理由使 && 表达式的类型与第二个操作数的类型相匹配?结果类型不应该像||操作符一样,返回两个操作数中最好的通用类型,如果没有最好的通用类型则返回Any?
【问题讨论】:
-
||的类型是什么?a ? b : c呢?如果我理解正确,a && b等同于a ? a : b(除了 a 在后一个示例中被评估两次) -
@ReyCharles
&&就像!a ? a : b和||就像a ? a : b。 -
对,对不起。那是脑残。我真正的问题是
a || b和a ? b : c的类型是什么。有趣的问题,顺便说一句。 -
@ReyCharles TypeScript 说
a || b的类型是Any,除非两个操作数有匹配的类型。在a ? b : c中,如果我没记错的话,TypeScript 要求b和c是同一类型。 -
更新:如果
strictNullChecks被启用,这现在可以在 Typescript 2 中正常工作。
标签: types typescript