Búsqueda de sitios web

typescript - TS: ¿Las afirmaciones de no nulo no se realizan en tiempo de ejecución?


Soy desarrollador de JS y nuevo en TS. Si tengo la siguiente línea de código:

  let corners = Boolean(checkTypes[userAccess]);

si lo cambio a esto:

  let corners = Boolean(checkTypes![userAccess]);

¿Por qué se desaprueba eso? Tenía un comentario que decía que las afirmaciones no nulas no son una verificación en tiempo de ejecución, entonces, ¿cuándo sucederían?

Respuesta #1

¿Las afirmaciones de no nulo no se realizan en tiempo de ejecución?

Correcto, el código de JavaScript será solo:

let corners = Boolean(checkTypes[userAccess]);

...y como resultado, si checkTypes es nulo o indefinido, ese código producirá un error.

¿Entonces, cuándo sucederían?

No lo harán, a menos que los programes. Las aserciones de tipo son exactamente eso: aserciones. Estás prometiendo a TypeScript que sabes que la aserción es verdadera. TypeScript no inserta código para verificar que tengas razón. Has afirmado que tienes razón.

Algunas opciones para ti:

  1. Si quieres una afirmación verificada, puedes escribir una función de afirmación (lamentablemente todavía no documentada en el manual):

    function assertIsNotNullish<T>(
        value: T | null | undefined,
        message?: string,
    ): asserts value is T {
        if (value == null) { // Which checks both `null` and `undefined`
            throw new Error(message ?? `Expected non-nullish value`);
        }
    }
    

    Entonces tu código sería:

    assertIsNotNullish(checkTypes, "checkTypes was unexpectedly nullish");
    let corners = Boolean(checkTypes[userAccess]); // No assertion needed
    
  2. Encadenamiento opcional y fusión nula (ambos ahora características de JavaScript):

    // Assuming you want `false` if `checkTypes` is nullish
    let corners = Boolean(checkTypes?.[userAccess] ?? false);
    //                              ^^            ^^^^^^^^^^
    
  3. Podrías tener un predicado de tipo:

    function isNotNullish<T>(value: T | null | undefined): value is T {
        return value != null; // Which checks both `null` and `undefined`
    }
    

    y luego

    let corners = isNotNullish(checkTypes)
        ? Boolean(checkTypes[userAccess])
        : false; // Or `true` if that should be the default