Ответ 1
Обратите внимание, что здесь вы получаете ошибку "Незаконный конструктор". Это отличается от ошибки "объект не является функцией", которую вы могли бы получить, если бы вы хотели написать new {}()
, например.
Итак, технически, HTMLDivElement
имеет конструктор. Просто именно этот конструктор генерирует исключение, а не создает объект.
Обычно lib.d.ts
просто исключает такие бесполезные сигнатуры, но TypeScript требует, чтобы правая часть оператора instanceof
имела конструктор. Другими словами, законно писать foo instanceof HTMLElement
, но не foo instanceof []
, а разность определяется тем, что HTMLElement
имеет конструктор.
Здесь было в основном три варианта:
- Удалите конструктивную подпись из элементов DOM и удалите ограничение на правый операнд
instanceof
. Это нежелательно, потому что вы действительно предпочитаете ловить ошибки, когда кто-то случайно записывает код типаx instanceof foo
вместоx instanceof foo
(гдеfoo
является экземпляромfoo
). - Удалить подпись конструкции из элементов DOM, но сохраните проверку
instanceof
. Это плохо, потому чтоfoo instanceof HTMLElement
- очень разумная вещь для написания. - Текущая ситуация, когда существуют конструкторы, но вы должны знать, что не называть их.
Вы не можете создавать элементы DOM, используя обычные конструкторы, потому что вы должны пройти через document.createElement
. Это в основном по техническим причинам, связанным с тем, как браузеры реализуют эти объекты.