Как мне убедить средство проверки Typescript, что значение является определенным подклассом в Javascript?

1

Я использую 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 в комментариях?

  • 0
    Я не касался какого - либо машинописного , но я видел , as быть хорошим ключевым словом для вашего сценария. var img = document.querySelector("#myImage") as HTMLImageElement
  • 0
    Прежде всего, используйте var , только если вы точно знаете его область scoping : лучше вместо этого использовать let . Затем, чтобы ответить на ваш вопрос, вы должны дать type вашей переменной img как и any . typescript не знает, какой у него type при вызове querySelector .
Показать ещё 3 комментария
Теги:
visual-studio-code

1 ответ

0

Обновление из проблемы Github, которую я связал в комментариях:

Сегодня нет "хорошего" способа его решения, но вы можете использовать явную проверку типа, чтобы заткнуть компилятор:

if (img instanceof HTMLImageElement) {
  img.src = "image.png";
}

Возможно, вы знаете, что проверка не может завершиться неудачей, но это делает шашку счастливой. В будущем контролер будет поддерживать директивы комментариев:

const el = /* @type {HTMLImageElement} */ (document.querySelector("#definitelyAnImage"));

Сегодня это происходит ночью, поэтому я ожидаю увидеть его в июльских или августовских выпусках, но это не официальное.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню