Подтвердить что ты не робот

Typescript преобразование в boolean

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

Но это кажется немного глупым. Есть ли лучший способ сделать это?

4b9b3361

Ответ 1

Вы можете использовать этот трюк, который Typescript разрешает и который отлично работает в JavaScript:

foo(!!xxx);

В качестве альтернативы добавьте его в any

foo(<any>xxx);

Ответ 2

Пока вы не можете набросить число непосредственно на логическое, вы можете отнести его в класс буфера Boolean и немедленно развернуть его. Например:

foo(<boolean><Boolean>xxx);

В то время как неуклюжий, он избегает стирания типа литья на <any>. Это также, возможно, менее неясное и более читаемое, чем подход !! (конечно же, в преобразованном js-коде).

Ответ 3

С помощью TypeScript 2.0.2 вы можете сделать это:

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!'

Ответ 4

foo(!!xxx); // This is the common way of coercing variable to booleans.
// Or less pretty
foo(xxx && true); // Same as foo(xxx || false)

Тем не менее, вы, вероятно, столкнетесь с дублированием двойного взрыва каждый раз, когда вы вызываете foo в свой код, поэтому лучшим решением является перемещение транзакции в boolean внутри функции DRY

foo(xxx);

foo(b: any){
  const _b = !!b;
  // Do foo with _b ...
}
  /*** OR ***/
foo(b: any){
  if(b){
    // Do foo ...
  }
}

Ответ 5

Вот мое решение:

const a: string = 'false';
const isAdd: boolean = new Boolean(a).valueOf();

if(isAdd) {
  // do something
}

Ответ 6

Использовать этот

YourMethod(!!isEnabled);

'!!' используется для приведения типа к логическому

Ответ 7

if (xxx) {...}//читается как ИСТИНА, если xxx НЕ является неопределенным, или равно нулю if (! xxx) {...}//читается как ИСТИНА, если xxx НЕ является неопределенным или равно нулю

Для строки типа 'true' или 'false': xxx.toLowerCase(). Trim() === 'true'? правда: ложь

так:

var zzz = 'true'; //string
var yyy = [];  //array

...

if(zzz.toLowerCase().trim() === 'true') { ... }  // quick string conversion

...

if(yyy ? true : false) { ... }  // quick any conversion - it TRUE if it 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;
  }
}