I am trying to instantiate new HTMLDivElement in TypeScript
var elem = new HTMLDivElement();
but the browser throws
Uncaught T
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:
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
).instanceof
check in place. This is bad because foo instanceof HTMLElement
is a very reasonable thing to write.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.