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:
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 neededEncadenamiento 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); // ^^ ^^^^^^^^^^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
