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?
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);
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é).
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!'
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 ...
}
}
Utilisez ceci
YourMethod(!!isEnabled);
'!!' est utilisé pour le transtypage à booléen
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;
}
}