El siguiente código es legal en TypeScript:

let asyncCondition = async(): Promise<boolean> => // .. calculate & return a boolean
if(asyncCondition()){ // forgot to await. condition is always true
  // .. do stuff
}

Dado que asyncCondition() devuelve un Promise normal no nulo, el código en el bloque if siempre se ejecutará. Este es el comportamiento de JavaScript y es comprensible que TypeScript no se queje.

Pero en el escenario anterior, lo que realmente quise decir es:

let asyncCondition = async(): Promise<boolean> => // .. calculate & return a boolean
if(await asyncCondition()){ // condition is asyncCondition()
  // .. do stuff
}

¿Hay alguna manera de permitir que TypeScript revise este tipo de errores por mí?

9
Pinyin 15 dic. 2016 a las 07:42

2 respuestas

La mejor respuesta

El compilador no lo hace y no espero que lo haga pronto. Se ha pedido y rechazado varias veces. Los casos que pude encontrar:

En cada caso, el razonamiento para cerrar estos problemas sin cambiar el compilador fue que sería un cambio demasiado radical y que realmente un linter debería hacer este trabajo.

La buena noticia es que recientemente se ha fusionada una nueva regla en la base de código de tslint para proporcionar advertencias sobre este problema. Sin embargo, por lo que puedo decir, la regla aún no está en una versión lanzada de tslint. Una vez que se publica, si configura strict-boolean-expressions en true en sus reglas tslint, entonces tslint le advertirá cuando use un condicional con una expresión que no es estrictamente booleana. .

6
Louis 15 dic. 2016 a las 12:14

Encontré un problema similar y encontré strict-boolean-expressions regla. No es la respuesta perfecta para el ejemplo dado por el OP, pero podría ser útil para otros.

La activación de esta regla provoca expresiones como

if (nonBooleanCondition) {

Para mostrar la siguiente advertencia:

Este tipo no está permitido en la condición 'si' porque es un [TIPO]. Solo se permiten valores booleanos.

1
LostMyGlasses 18 feb. 2019 a las 07:57