Typescript分配一个空字符串而不是布尔值

时间:2018-10-09 12:18:04

标签: typescript

给出此打字稿(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);

我有点困惑。第二个示例的行为应与第一个类似,对吗?我想念什么?

3 个答案:

答案 0 :(得分:6)

a.b && a.b.length > 0等效于"" && false,因为空字符串评估为虚假。表达式"" && false的值为""。这就是a.c""的原因。

像这样重构它,

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

答案 1 :(得分:3)

这更多是Javascript真实/错误问题。 &&运算符将返回操作数之一的值。参见docs

  

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

并且专门针对&&

  

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

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

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

答案 2 :(得分:0)

依靠@nrgwsth的回复,您可以在如下情况下通过将a.b替换为!!a.b来进一步重构同时保持结构:

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

应用!a.b会将a.b转换为其布尔负数,应用!!a.b将为评估提供正布尔值。