Visual Studio暗示document.bodyHTMLElement,而不是HTMLBodyElement,为什么呢? -我没有运气来寻找答案。

class Test {
    documentBody1: HTMLBodyElement;
    documentBody2: HTMLElement;

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

最佳答案

属性document.body的类型为HTMLElement,但是在大多数情况下,它引用的对象实际上是HTMLBodyElement
那么,为什么document.body不键入HTMLBodyElement呢?因为在某些文档中,它可能引用HTMLFrameSetElementHTMLElementHTMLBodyElementHTMLFrameSetElement的常见父类(super class)型。
规范中有关 document.body 的更多内容。

在评论中,icl7126 asks是一个好问题:

我的猜测是实用主义。在TypeScript社区(和项目本身)中,有很多实用主义而不是理想主义。由于人们几乎从来没有在body出现之前就运行过与DOM交互的代码,而不是在使用document.body时使每个人都添加了几乎肯定不必要的保护或非空的断言,因此定义TypeScript类型的一个人或一个人与HTMLElement一起使用而不是HTMLElement | null。这不是完全正确的,但是它在正确和有用之间取得了平衡。

09-18 12:53