Каков правильный способ проверки типов элементов querySelector/querySelectorAll?

Фон

Я реализую Flow для проверки типов моих свойств в javascript. Это ретро-подгонка, поэтому я начинаю с маленького класса.

Я использую определения свойств этапа 2 es2017, см. здесь

Большинство свойств моего класса — это элементы dom, полученные с помощью querySelector.

Проблема

У меня возникают проблемы с получением правильного типа для этих элементов. Например

export default class myClass {
  myElement: HTMLElement = document.querySelector('.myElement');

  constructor () {
    if (this.myElement !== null) {
      this.myFunc(this.myElement);
    }
  }

  myFunc (element: HTMLElement) {
    ...
  }
}

Это терпит неудачу, говоря, что this.myElement if равно null и несовместимо с myFunc (element: HTMLElement)

Уже пробовал

Я видел еще один вопрос о чем-то подобном с iFrame. Но решение очень мутное. Это включает в себя приведение к любому, а затем к вашему правильному элементу. как

var myIframe = ((document.querySelector('iframe'): any): HTMLIFrameElement);

Я не хочу каждый раз отбрасывать такие элементы.

Вопрос

Есть ли чистое решение для объявления элементов как типов в Flow?


person Joe Lloyd    schedule 17.05.2017    source источник
comment
Вы пробовали myElements: ?Node ?   -  person Felix Kling    schedule 17.05.2017
comment
@FelixKling Я пробовал это, но столкнулся с проблемой на странице, где мне сказали, что элемент может быть не определен, когда я пытался его использовать. Хотя я обернул всю логику в оператор if. Убедившись, что он будет определен   -  person Joe Lloyd    schedule 17.05.2017
comment
Кажется, это работает для меня здесь:   -  person Felix Kling    schedule 17.05.2017
comment
Не уверен, что он на 100% квалифицирован как дубликат, но мой ответ на stackoverflow.com/questions/42377663/ расширяет это. Если вы хотите : Node без ?, вам нужно доказать средству проверки типов, что он гарантированно существует, поскольку Flow не может узнать, будет ли запрос выполнен успешно.   -  person loganfsmyth    schedule 17.05.2017
comment
@FelixKling при объявлении свойства в классе кажется, что я должен проверить, является ли оно нулевым, прежде чем использовать его в любом другом методе класса. Обходной путь заключался в том, чтобы передать его каждому методу вместо того, чтобы иметь глобальные классы (свойства). Является ли это способом обеспечить лучшее кодирование? передача параметров вместо использования атрибутов класса?   -  person Joe Lloyd    schedule 22.05.2017