Typescript转换为boolean

时间:2013-11-20 10:40:00

标签: typescript

在打字稿中,我可以这样做:

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);

但这似乎有点傻。有没有更好的方法呢?

7 个答案:

答案 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;
  }
}