web-dev-qa-db-fra.com

Conversion du manuscrit en booléen

Dans TypeScript je peux faire ceci:

var xxx : some_type;

if (xxx)
    foo();
else
    bar();

Ici, xxx sera traité comme un booléen, quel que soit son type.

Je voudrais faire la même chose dans un argument de fonction. J'ai cette fonction:

function foo(b : boolean) { ... }

Je veux pouvoir appeler foo(xxx) et que xxx soit traité comme un booléen, quel que soit son type. Mais TypeScript ne le permettra pas.

J'ai essayé ceci:

foo(<boolean>xxx);

mais ce TypeScript ne le permettra pas non plus.

Je peux le faire:

foo(xxx ? true : false);

Mais cela semble un peu bête. Y a-t-il une meilleure façon de le faire?

44
oz1cz

Vous pouvez utiliser cette astuce que TypeScript permet et qui fonctionne très bien en JavaScript:

foo(!!xxx);

Vous pouvez également le convertir en any

foo(<any>xxx);
61
Knaģis

Bien que vous ne puissiez pas attribuer un nombre directement à un booléen, vous pouvez le lancer dans la classe booléenne wrapper et le désemballer immédiatement. Par exemple:

foo(<boolean><Boolean>xxx);

Bien que maladroit, il évite le type d’effacement de la conversion en <any>. C'est aussi sans doute moins obscur et plus lisible que l'approche !! (certainement dans le code js transpilé).

8
dug

Avec TypeScript 2.0.2, vous pouvez faire ceci:

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!'
7
benlambert
foo(!!xxx); // This is the common way of coercing variable to booleans.
// Or less pretty
foo(xxx && true); // Same as foo(xxx || false)

Cependant, vous finirez probablement par dupliquer le double coup chaque fois que vous appelez foo dans votre code. Il est donc préférable de déplacer le forçage sur booléen dans la fonction DRY

foo(xxx);

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

Utilisez ceci

YourMethod(!!isEnabled);

'!!' est utilisé pour le transtypage à booléen

0
Abdus Salam Azad

if (xxx) {...} // lu comme VRAI si xxx n'est PAS indéfini ou nul if (! xxx) {...} // lu comme VRAI si xxx IS non défini ou nul

Pour une chaîne telle que 'true' ou 'false': Xxx.toLowerCase (). Trim () === 'true'? vrai faux

alors:

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;
  }
}
0
Lubo