Visual Studio暗示document.body
是HTMLElement
,而不是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
呢?因为在某些文档中,它可能引用HTMLFrameSetElement
。 HTMLElement
是HTMLBodyElement
和HTMLFrameSetElement
的常见父类(super class)型。
规范中有关 document.body
的更多内容。
在评论中,icl7126 asks是一个好问题:
我的猜测是实用主义。在TypeScript社区(和项目本身)中,有很多实用主义而不是理想主义。由于人们几乎从来没有在body
出现之前就运行过与DOM交互的代码,而不是在使用document.body
时使每个人都添加了几乎肯定不必要的保护或非空的断言,因此定义TypeScript类型的一个人或一个人与HTMLElement
一起使用而不是HTMLElement | null
。这不是完全正确的,但是它在正确和有用之间取得了平衡。