在打字稿中,我可以这样做:
var xxx : some_type;
if (xxx)
foo();
else
bar();
此处xxx将被视为布尔值,无论其类型如何。
我想在函数参数中做同样的事情。我有这个功能:
function foo(b : boolean) { ... }
我希望能够调用foo(xxx)
并将xxx视为布尔值,无论其类型如何。但是Typescript不允许这样做。
我试过了:
foo(<boolean>xxx);
但是那些Typescript也不允许这样做。
我可以这样做:
foo(xxx ? true : false);
但这似乎有点傻。有没有更好的方法呢?
答案 0 :(得分:64)
你可以使用这个技巧,这个技巧是Typescript允许的,并且可以在JavaScript中正常工作:
foo(!!xxx);
或者,将其投放到any
foo(<any>xxx);
答案 1 :(得分:8)
虽然您无法直接将数字转换为布尔值,但您可以将其转换为包装器布尔类并立即打开它。例如:
foo(<boolean><Boolean>xxx);
虽然笨拙,但它避免了对<any>
施放的类型擦除。它也可以说不那么晦涩难懂。比!!
方法更具可读性(在转换的js代码中肯定如此)。
答案 2 :(得分:7)
With TypeScript 2.0.2 you can do this:
type Falsey = '' | 0 | false | null | undefined;
function eatFruit(fruit: string | Falsey) {
if (fruit) {
alert(`Ate ${fruit}`);
} else {
alert('No fruit to eat!');
}
}
const fruits = ['apple', 'banana', 'pear'];
eatFruit(fruits[0]); // alerts 'Ate apple'
eatFruit(fruits[1]); // alerts 'Ate banana'
eatFruit(fruits[2]); // alerts 'Ate pear'
eatFruit(fruits[3]); // alerts 'No fruit to eat!'
const bestBeforeDay = 12;
let day = 11;
eatFruit(day < bestBeforeDay && 'peach'); // alerts 'Ate peach'
day += 1;
eatFruit(day < bestBeforeDay && 'peach'); // alerts 'No fruit to eat!'
let numMangos = 1;
eatFruit(numMangos && 'mango'); // alerts 'Ate Mango'
numMangos -= 1;
eatFruit(numMangos && 'mango'); // alerts 'No fruit to eat!'
答案 3 :(得分:2)
foo(!!xxx); // This is the common way of coercing variable to booleans.
// Or less pretty
foo(xxx && true); // Same as foo(xxx || false)
但是,每次在代码中调用foo
时,最终可能会重复双重爆炸,因此更好的解决方案是将强制移动到函数DRY内的布尔值
foo(xxx);
foo(b: any){
const _b = !!b;
// Do foo with _b ...
}
/*** OR ***/
foo(b: any){
if(b){
// Do foo ...
}
}
答案 4 :(得分:0)
使用此
YourMethod(!!isEnabled);
'!!'用于将类型转换为布尔值
答案 5 :(得分:0)
这是一个简单的函数,可以处理大多数情况,包括将布尔值作为输入(以防万一):
type Falsey = undefined | null;
const parseBoolean = (val: string | boolean | number | Falsey): boolean => {
const s = val && val.toString().toLowerCase().trim();
if (s == 'true' || s == '1')
return true;
return false;
}
这是一个有趣的测试:
describe('Boolean Parser', () => {
[
{ val: 'true', expected: true },
{ val: 'false', expected: false },
{ val: 'True', expected: true },
{ val: 'False', expected: false },
{ val: 'TRUE', expected: true },
{ val: 'FALSE', expected: false },
{ val: '', expected: false },
{ val: '1', expected: true },
{ val: '0', expected: false },
{ val: false, expected: false },
{ val: true, expected: true },
{ val: undefined, expected: false },
{ val: null, expected: false },
{ val: 0, expected: false },
{ val: 1, expected: true },
{ val: 111, expected: false }
].forEach(args => {
it(`should parse ${args.val} to boolean`, () => {
expect(parseBoolean(args.val)).toBe(args.expected);
});
})
});
答案 6 :(得分:-1)
if(xxx){...} //如果xxx不是undefined或null则读为TRUE if(!xxx){...} //如果xxx未定义或为空,则读为TRUE
对于“ true”或“ false”之类的字符串: xxx.toLowerCase()。trim()==='true'吗? true:否
如此:
var zzz = 'true'; //string
var yyy = []; //array
...
if(zzz.toLowerCase().trim() === 'true') { ... } // quick string conversion
...
if(yyy ? true : false) { ... } // quick any conversion - it's TRUE if it's not null or undefined
...
// in a catch-all function
if(toBoolean(zzz)) { ... }
if(toBoolean(yyy)) { ... }
toBoolean(xxx: any): boolean {
if(xxx) {
const xStr = xxx.toString().toLowerCase().trim();
if(xStr === 'true' || x === 'false') {
return xStr === 'true' ? true : false;
} else {
return xxx ? true : false;
}
} else {
return false;
}
}