在TypeScript中实例化新HtmleElement

在TypeScript中实例化新HtmleElement,typescript,Typescript,我正在尝试用TypeScript实例化新的htmldevelment var elem = new HTMLDivElement(); 但是浏览器抛出 Uncaught TypeError: Illegal constructor. 解决方法似乎是使用 var elem = document.createElement('div'); 但我发现由于各种原因,这并不理想 当lib.d.ts中有一个新的关键字时,为什么我不能直接实例化DOM元素 declare var HTMLDivEleme

我正在尝试用TypeScript实例化新的htmldevelment

var elem = new HTMLDivElement();
但是浏览器抛出

Uncaught TypeError: Illegal constructor.
解决方法似乎是使用

var elem = document.createElement('div');
但我发现由于各种原因,这并不理想

lib.d.ts中有一个新的关键字时,为什么我不能直接实例化DOM元素

declare var HTMLDivElement: {
    prototype: HTMLDivElement;
    new (): HTMLDivElement;
}

请注意,这里出现的错误是“非法构造函数”。例如,如果编写
new{}()
,就会出现错误“object不是函数”,这与此不同

因此,从技术上讲,
htmldevelment
确实有一个构造函数。只是这个特定的构造函数抛出了一个异常,而不是创建一个对象

通常
lib.d.ts
只会排除这些无用的签名,但TypeScript要求
instanceof
操作符的右侧有一个构造函数。换句话说,合法的做法是编写
foo instanceof HTMLElement
,而不是
foo instanceof[]
,区别在于
HTMLElement
有一个构造函数

这里的桌子上基本上有三种选择:

  • 从DOM元素中删除构造签名,并删除对右操作数的
    实例的限制。这是不可取的,因为您确实更希望捕获错误,即有人意外编写了类似于
    x instanceof foo
    的代码,而不是
    x instanceof foo
    (其中
    foo
    foo
    的实例)
  • 从DOM元素中删除构造签名,但保留
    instanceof
    复选框。这是不好的,因为HTMLElement的
    foo instanceof是一个非常合理的编写方法
  • 当前的情况是,构造函数存在,但您必须知道不要调用它们

  • 您不能使用普通构造函数构造DOM元素,因为您需要遍历
    document.createElement
    。这主要是由于浏览器如何实现这些对象的技术原因。

    您将typescript语法与c#语法弄错了

    替换

    var elem = new HTMLDivElement();
    
    使用以下选项之一

    var elem = document.createElement('div');
    


    (如果需要使用HtmlLevel属性)

    如果扩展
    HTMLElement
    或任何类似
    HtmlLevel

    您还需要注册自定义元素

    
    类SampleDiv扩展了htmldevelment{
    构造函数(){
    超级();
    }
    }
    define('sample-div',SampleDiv,{extends:'div'});
    
    请参阅此处的更多信息:

    令人惊讶的解释。是否可以在lib.d.ts中发表评论来解释这一点?或者您不想用注释污染lib.d.ts?为调用
    元素的子类上的构造函数的代码添加来自
    tsc
    的警告或错误是否有意义?如果您扩展了HtmleElement,例如
    class Thing Extendes HtmleElement
    ,那么您可以使用new创建一个带有
    let t=new Thing()的实例
    。然后您可以将其添加到DOM中!Kokodoko,情况似乎并非如此:
    类事物扩展了HtmleElement{}
    let t=new Thing()
    导致
    TypeError:非法构造函数。
    customElements.define('custom tag',Thing)
    然后调用
    newthing()
    -返回
    如果我没有弄错的话,您需要将
    {extends:'div'}
    作为define函数的第三个参数:如:
    customElements.define('sample-div',SampleDiv,{extends:'div'})
    
    var elem = <HTMLDivElement>(document.createElement('div'));
    
    let elem = document.createElement('div') as HTMLDivElement