可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I am trying to instantiate new HTMLDivElement in TypeScript
var elem = new HTMLDivElement();
but the browser throws
Uncaught TypeError: Illegal constructor.
The workaround seems to be to use
var elem = document.createElement('div');
but I find this suboptimal for various reasons.
Why can't I instantiate DOM elements directly when there is a new keyword for in in the lib.d.ts?
declare var HTMLDivElement: { prototype: HTMLDivElement; new (): HTMLDivElement; }
回答1:
Note that the error you get here is "Illegal constructor". This is different from the error "object is not a function" that you would get if you were to write new {}()
, for example.
So, technically, HTMLDivElement
does have a constructor. It's just that this particular constructor throws an exception rather than creating an object.
Normally lib.d.ts
would just exclude such useless signatures, but TypeScript requires that the right-hand side of the instanceof
operator have a constructor. In other words, it's legal to write foo instanceof HTMLElement
, but not foo instanceof []
, and the difference is determined by the fact that HTMLElement
has a constructor.
There were basically three choices on the table here:
- Remove the construct signature from the DOM elements and remove the restriction on
instanceof
's right operand. This is undesirable because you'd really prefer to catch errors where someone accidentally writes code like x instanceof foo
instead of x instanceof Foo
(where foo
is an instance of Foo
). - Remove the construct signature from DOM elements, but keep the
instanceof
check in place. This is bad because foo instanceof HTMLElement
is a very reasonable thing to write. - The current situation, where the constructors exist but you have to know not to call them.
You can't construct DOM elements using normal constructors because you're supposed to go through document.createElement
. This is basically for technical reasons relating to how browsers implement these objects.
回答2:
You have mistaken typescript syntax with c# syntax.
Just replace
var elem = new HTMLDivElement();
width
var elem = document.createElement('div');
or
var elem = <HTMLDivElement>(document.createElement('div'));
(if you need to use HTMLDivElement attributes)