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