为什么document.body不是HTMLBodyElement?

Tc_*_*Tc_ 5 strong-typing typescript

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

class Test {
    documentBody1: HTMLBodyElement;
    documentBody2: HTMLElement;

    constructor(){
        this.documentBody1 = document.body; //wrong
        this.documentBody2 = document.body; //right
    }
}
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 5

属性 的类型document.bodyHTMLElement,但在大多数情况下,它指的是一个实际上是HTMLBodyElement.

那么为什么document.body不输入HTMLBodyElement呢?因为在某些文档中,它可能会引用一个HTMLFrameSetElement. HTMLElementHTMLBodyElementand的共同超类型HTMLFrameSetElement

更多在document.body规范中。


在评论中,icl7126 问了个好问题:

我想知道为什么没有空值?当文档尚未加载时它将为空...

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

  • 我想知道为什么没有“null”?当文档尚未加载时,它将为“null”,并且在规范中也提到了:_body 属性在获取时必须返回文档的 body 元素(body 元素、frameset 元素或 null)_ (3认同)
  • @icl7126 - 这是一个非常好的问题。我已经用我的看法更新了答案。 (2认同)