typescript - parse - Conversión de mecanografía a booleano
parse boolean javascript (4)
Con TypeScript 2.0.2 puede hacer esto:
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!''
En Typescript puedo hacer esto:
var xxx : some_type;
if (xxx)
foo();
else
bar();
Aquí xxx se tratará como booleano, independientemente de su tipo.
Me gustaría hacer lo mismo en un argumento de función. Tengo esta función:
function foo(b : boolean) { ... }
Quiero poder llamar a foo(xxx)
y hacer que xxx sea tratado como booleano, independientemente de su tipo. Pero Typescript no permitirá eso.
Intenté esto:
foo(<boolean>xxx);
pero ese Typescript tampoco permitirá eso.
Puedo hacer esto:
foo(xxx ? true : false);
Pero eso parece un poco tonto. Hay una mejor manera de hacerlo?
Puede usar este truco que permite TypeScript y que funciona bien en JavaScript:
foo(!!xxx);
Alternativamente, puedes lanzarlo a any
foo(<any>xxx);
Si bien no puedes convertir un número directamente a un booleano, puedes convertirlo a la clase booleana contenedora e inmediatamente desenvolverlo. Por ejemplo:
foo(<boolean><Boolean>xxx);
Aunque es torpe, evita el borrado de tipos de conversión a <any>
. ¡También es posiblemente menos oscuro y más legible que el !!
enfoque (sin duda también en el código js transpilado).
foo(!!xxx); // This is the common way of coercing variable to booleans.
// Or less pretty
foo(xxx && true); // Same as foo(xxx || false)
Sin embargo, probablemente termines duplicando el double bang cada vez que invoques a foo
en tu código, por lo que una mejor solución es mover la coerción a boolean dentro de la función DRY
foo(xxx);
foo(b: any){
const _b = !!b;
// Do foo with _b ...
}
/*** OR ***/
foo(b: any){
if(b){
// Do foo ...
}
}