在TypeScript中实例化新HtmleElement
我正在尝试用TypeScript实例化新的htmldevelment在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
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
有一个构造函数
这里的桌子上基本上有三种选择:
实例的限制。这是不可取的,因为您确实更希望捕获错误,即有人意外编写了类似于x instanceof foo
的代码,而不是x instanceof foo
(其中foo
是foo
的实例)
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