Я использую VS Code с включенной (относительно) новой опцией checkJS
- я пишу Javascript, но это позволяет механизму машинописного машиностроения делать ограниченную проверку типов.
Я ищу элемент DOM, используя querySelector
и получая доступ к свойству, специфичному для элемента:
var img = document.querySelctor("#myImage");
img.src = "image.png";
Это заставляет Code .src
вторую строку как проблему, так как querySelector возвращает только Element
а свойство .src
является членом HTMLImageElement
. В фактическом машинописном тексте я бы бросил (coerce? Assert?) Возвращаемое значение перед доступом к свойству, но поскольку это ванильный Javascript, это не вариант. Есть ли другой способ избежать переполнения моего кода с помощью флажков управления TS в комментариях?
Обновление из проблемы Github, которую я связал в комментариях:
Сегодня нет "хорошего" способа его решения, но вы можете использовать явную проверку типа, чтобы заткнуть компилятор:
if (img instanceof HTMLImageElement) {
img.src = "image.png";
}
Возможно, вы знаете, что проверка не может завершиться неудачей, но это делает шашку счастливой. В будущем контролер будет поддерживать директивы комментариев:
const el = /* @type {HTMLImageElement} */ (document.querySelector("#definitelyAnImage"));
Сегодня это происходит ночью, поэтому я ожидаю увидеть его в июльских или августовских выпусках, но это не официальное.
as
быть хорошим ключевым словом для вашего сценария.var img = document.querySelector("#myImage") as HTMLImageElement
var
, только если вы точно знаете его областьscoping
: лучше вместо этого использоватьlet
. Затем, чтобы ответить на ваш вопрос, вы должны датьtype
вашей переменнойimg
как иany
.typescript
не знает, какой у негоtype
при вызовеquerySelector
.