【问题标题】:Why is document.body not a HTMLBodyElement?为什么 document.body 不是 HTMLBodyElement?
【发布时间】:2016-05-19 17:42:46
【问题描述】:

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

class Test {
    documentBody1: HTMLBodyElement;
    documentBody2: HTMLElement;

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

【问题讨论】:

    标签: typescript strong-typing


    【解决方案1】:

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

    那么为什么document.body 没有输入HTMLBodyElement?因为在某些文档中,它可能引用了HTMLFrameSetElementHTMLElementHTMLBodyElementHTMLFrameSetElement 的通用超类型。

    更多信息请参阅规范中的document.body


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

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

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

    【讨论】:

    • 我想知道为什么没有null?当文档尚未加载时,它将是null,并且在规范中也提到了:body 属性,在获取时,必须返回文档的 body 元素(body 元素、frameset 元素或空)
    • @icl7126 - 这是一个非常好的问题。我已经用我的看法更新了答案。
    猜你喜欢
    • 1970-01-01
    • 2012-10-08
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多