繁体   English   中英

打字稿:联合类型和三元运算符的类型推断

[英]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 | 10 然而,仅仅通过看代码很明显,这可能是因为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM