【问题标题】:Typescript assigns an empty string instead of a boolean打字稿分配一个空字符串而不是布尔值
【发布时间】:2019-03-14 05:23:18
【问题描述】:

鉴于此打字稿(2.7.2)界面:

export interface A {
  b?: string;
  c?: boolean;
}

这将按预期打印布尔值“false”:

let a: A = {b: ''};
if (a.b && a.b.length > 0) {
  a.c = true;
} else {
  a.c = false;
}
console.log(a.c);

但是,这会打印一个空的 '' 字符串:

let a: A = {b: ''};
a.c = a.b && a.b.length > 0;
console.log(a.c);

我在这里有点困惑。第二个例子的行为应该和第一个一样,对吧?我错过了什么?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    a.b && a.b.length > 0 等价于"" && false,因为空字符串的计算结果是假的。表达式 "" && false 的计算结果为 ""。这就是为什么a.c""

    像这样重构它,

    a.c = a.b && a.b.length > 0 ? true : false
    

    【讨论】:

    • 很高兴知道:IntelliJ 不够聪明,无法处理这个问题。它会发出警告,说明此代码可以简化。
    【解决方案2】:

    根据@nrgwsth 的回复,您可以在保持结构的同时进一步重构,方法是在您的条件下将a.b 替换为!!a.b

    let a: A = {b: ''};
    a.c = !!a.b && a.b.length > 0;
    console.log(a.c);
    

    应用!a.ba.b 转换为其布尔负数,应用!!a.b 为您提供正布尔版本的评估。

    【讨论】:

      【解决方案3】:

      这更像是一个 Javascript 真/假问题。 && 运算符将返回操作数之一的值。见docs

      然而,&& 和 ||运算符实际上返回指定操作数之一的值,因此如果这些运算符与非布尔值一起使用,它们可能返回非布尔值。

      专门针对&&

      如果可以转换为false则返回expr1;否则,返回 expr2。因此,当与布尔值一起使用时,如果两个操作数都为真,则 && 返回真;否则,返回 false。

      在您的情况下,"" 是一个假值,因此可以将其转换为假。如果您想确保获得布尔值,请使用 !!(即双重否定)

      let a: A = {b: ''};
      a.c = !!(a.b && a.b.length > 0);
      console.log(a.c);
      

      【讨论】:

        猜你喜欢
        • 2019-05-03
        • 2020-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-17
        • 1970-01-01
        相关资源
        最近更新 更多