Estoy desarrollando un proyecto Angular usando jQuery y noté una extraña anomalía. Mire el siguiente código TypeScript de una clase de componente Angular:
let foo :any | undefined = window.innerWidth * 0.26; // first line has no error let bar :any | undefined = $(window).width() * 0.26; // second line has an error La segunda línea devuelve un error de compilación: el Object is possibly 'undefined'.ts(2532) . Supongamos que existe tal caso y el compilador tiene razón, cuando el objeto de la window de alguna manera no se inicializó y observe este código;
let asd :number = window.innerWidth * 0.26; // third line also has no errorEn este caso, puede haber dos errores (consulte este enlace como referencia);
window no tiene definida la propiedad innerWidth , por lo que asd recibirá undefined como valor, que no es de tipo number , por lo que el compilador debe arrojar Type 'undefined' is not assignable to type 'number'.ts(2322) o el Object is possibly 'undefined'.ts(2532)window no fue instanciado, en cuyo caso su tipo es null , por lo que asd no recibirá ningún valor y el programa regresará con ReferenceError .Para una prueba de concepto, vea esta instantánea del editor TryIt de w3schools ;
Entonces, mi pregunta es: ¿por qué el compilador de TypeScript muestra un error para la asignación de valor con el método jQuery (primera línea), pero no un error del compilador usando el enfoque de propiedad de objeto JS nativo (segunda y tercera línea)?
El tipo de retorno de
$(window).width()es
number | undefinedla multiplicacion
$(window).width() * 0.26 sólo se permite para dos números. Tienes que manejar el caso para undefined . Usaría una variable temporal y el operador ternario condicional:
const width = $(window).width(); let bar :any | undefined = width ? width * 0.26 : undefined;Las otras líneas no causan un error porque
window.innerWidthtiene tipo
number