Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript指定一个空字符串而不是布尔值_Typescript - Fatal编程技术网

Typescript指定一个空字符串而不是布尔值

Typescript指定一个空字符串而不是布尔值,typescript,Typescript,给定此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); 但是,这会打印一个空的“”字符串: 我有点困惑。第二个例子应该和第一个

给定此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);
但是,这会打印一个空的“”字符串:


我有点困惑。第二个例子应该和第一个一样,对吗?我遗漏了什么?

a.b&&a.b.length>0
,这相当于
“”&&false
,因为空字符串计算falsy。表达式
”“&&false
的计算结果为
”“
。这就是为什么
a.c

像这样重构它

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

这更像是一个Javascript真实/虚假的问题。
&&
运算符将返回其中一个操作数的值。见:

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

特别是对于
&&

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

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


依靠@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
为您提供正布尔版本的评估。

很高兴知道:IntelliJ不够聪明,无法处理此问题。它会发出一个警告,说明此代码可以简化。
let a: A = {b: ''};
a.c = !!(a.b && a.b.length > 0);
console.log(a.c);
let a: A = {b: ''};
a.c = !!a.b && a.b.length > 0;
console.log(a.c);