我正在尝试在TypeScript中实例化新的HTMLDivElement
var elem = new HTMLDivElement();
但是浏览器抛出
Uncaught TypeError: Illegal constructor.
解决方法似乎是使用
var elem = document.createElement('div');
但由于各种原因,我发现这并不是最优的。
当lib.d.ts中存在用于in的new关键字时,为什么不能直接实例化DOM元素
declare var HTMLDivElement: {
prototype: HTMLDivElement;
new (): HTMLDivElement;
}
发布于 2014-10-07 01:28:04
注意,你在这里得到的错误是“非法构造函数”。这与错误"object is not a function“是不同的,例如,如果你要编写new {}()
,你会得到这样的错误。
因此,从技术上讲,HTMLDivElement
确实有一个构造函数。只是这个特殊的构造函数抛出了一个异常,而不是创建一个对象。
通常,lib.d.ts
只会排除这些无用的签名,但TypeScript要求instanceof
操作符的右侧有一个构造函数。换句话说,编写foo instanceof HTMLElement
是合法的,但编写foo instanceof []
是不合法的,区别是由HTMLElement
具有构造函数这一事实决定的。
这里基本上有三个选择:
instanceof
右操作数的限制。这是不可取的,因为您真的希望捕获以下错误:有人意外地编写了x instanceof foo
之类的代码,而不是x instanceof Foo
(其中foo
是DOM元素的构造签名的实例,但保留instanceof
检查)。这很糟糕,因为foo instanceof HTMLElement
是一个非常合理的编写方法。H119当前的情况,即构造函数存在,但您必须知道不能调用它们。
您不能使用普通构造函数来构造DOM元素,因为您应该通过document.createElement
。这基本上是由于与浏览器如何实现这些对象相关的技术原因。
发布于 2017-08-13 18:15:23
您在c#语法中使用了错误的typescript语法。
只需替换
var elem = new HTMLDivElement();
具有以下任一项
var elem = document.createElement('div');
或
var elem = <HTMLDivElement>(document.createElement('div'));
或
let elem = document.createElement('div') as HTMLDivElement
(如果需要使用HTMLDivElement属性)
发布于 2019-05-26 14:03:35
如果您扩展HTMLElement
或HTMLDivElement
之类的任何子类
您还需要注册自定义元素
class SampleDiv extends HTMLDivElement{
constructor(){
super();
}
}
customElements.define('sample-div', SampleDiv, { extends: 'div' });
点击此处查看更多信息:https://javascript.info/custom-elements
https://stackoverflow.com/questions/26220243
复制相似问题