[英]Typescript: Type inference with union types and ternary operator
以下打字稿代码可以正常编译:
let x: 0 | 1 = 0;
console.log(x);
const r = [true, false];
for (const y of r) {
if (y || (x !== 1)) {
x = 1;
} else {
x = 0;
}
console.log(x);
}
但是,此代码在语义上是等效的,它不会:
let x: 0 | 1 = 0;
console.log(x);
const r = [true, false];
for (const y of r) {
x = ((y || (x !== 1)) ? 1 : 0);
console.log(x);
}
x !== 1
错误是:
7:17 error TS2367: This condition will always return 'true' since the types '0' and '1' have no overlap.
在这两种情况下,运行编译结果都会产生预期的输出,表明x实际上确实取值0 和 1:
0
1
0
我理解错误源于编译器缩小了类型0 | 1
的事实0 | 1
在第二种情况下为0 | 1
到0
。 然而,仅仅通过看代码很明显,这可能是因为x
分配1(即使不看条件)。 因此,除非另有明确说明,否则我希望类型推断采用最通用的类型(如第一个示例中所述)。 实际上,在第1行中,我明确告诉编译器我需要更通用的类型: let x: 0 | 1
let x: 0 | 1
。
因此,我的问题是,如果存在明智的理由,那么对于三元运算符,类型推断的行为会有所不同?
该错误实际上是因为编译器将x
的类型缩小为0
。
我不确定在其他情况下为什么没有收到错误-我希望在两种情况下都能保持一致-但是我不够聪明,无法编写执行此操作的工具。
x
的类型强制为0 | 1
示例 0 | 1
而不是编译器将其范围缩小为零:
let x = 0 as 0 | 1;
console.log(x);
const r = [true, false];
for (const y of r) {
x = ((y || (x !== 1)) ? 1 : 0);
console.log(x);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.