Búsqueda de sitios web

typescript - ¿Por qué document.body no es un HTMLBodyElement?


Visual Studio, indica que document.body es un HTMLElement, y no un HTMLBodyElement, ¿por qué es eso? - No he tenido suerte buscando una respuesta.

class Test {
    documentBody1: HTMLBodyElement;
    documentBody2: HTMLElement;

    constructor(){
        this.documentBody1 = document.body; //wrong
        this.documentBody2 = document.body; //right
    }
}

Respuesta #1

El tipo de la propiedad document.body es HTMLElement, pero en la mayoría de los casos se refiere a un objeto que en realidad es un HTMLBodyElement.

Entonces, ¿por qué document.body no tiene el tipo HTMLBodyElement? Porque en algunos documentos, puede referirse a un HTMLFrameSetElement. HTMLElement es el supertipo común de HTMLBodyElement y HTMLFrameSetElement.

Más en document.body en la especificación.


En un comentario, icl7126 hace una buena pregunta:

Me pregunto por qué no hay null. Será null cuando el documento aún no esté cargado...

Mi suposición es pragmatismo. Hay mucho pragmatismo más que idealismo en la comunidad de TypeScript (y en el propio proyecto). Dado que la gente casi nunca ejecuta código que interactúa con el DOM antes de que el body esté presente, en lugar de hacer que todos agreguen una guardia casi seguramente innecesaria o una afirmación de no nulo al usar document.body, la persona o las personas que definieron ese tipo de TypeScript optaron por HTMLElement en lugar de HTMLElement | null. No es perfectamente correcto, pero es un equilibrio entre lo correcto y lo útil.

Artículos relacionados