Подтвердить что ты не робот

Почему Event.target not Element в Typescript?

Я просто хочу сделать это с помощью своего KeyboardEvent

var tag = evt.target.tagName.toLowerCase();

Пока Event.target имеет тип EventTarget, он не наследует от Element. Поэтому я должен сделать это следующим образом:

var tag = (<Element>evt.target).tagName.toLowerCase();

Вероятно, это связано с тем, что некоторые браузеры не соответствуют стандартам, не так ли? Какова правильная реализация агностики браузера в TypeScript?

PS: Я использую jQuery для захвата KeyboardEvent.

4b9b3361

Ответ 1

Он не наследуется от Element, потому что не все объекты событий являются элементами.

Из MDN:

Элемент, документ и окно являются наиболее распространенными целями событий, но другие объекты также могут быть объектами событий, например XMLHttpRequest, AudioNode, AudioContext и т.д.

Даже те KeyboardEvent, которые вы пытаетесь использовать, могут возникать в элементе DOM или в объекте окна (и, теоретически, на других вещах), поэтому прямо здесь не было бы смысла определять evt.target как a Element.

Если это событие в элементе DOM, я бы сказал, что вы можете смело предположить evt.target. является Element. Я не думаю, что это вопрос кросс-браузерного поведения. Просто, что EventTarget является более абстрактным интерфейсом, чем Element.

Дополнительная литература: https://typescript.codeplex.com/discussions/432211

Ответ 2

Используя машинопись, я использую пользовательский интерфейс, который применяется только к моей функции. Пример использования.

  handleChange(event: { target: HTMLInputElement; }) {
    this.setState({ value: event.target.value });
  }

В этом случае handleChange получит объект с целевым полем типа HTMLInputElement.

Позже в моем коде я могу использовать

<input type='text' value={this.state.value} onChange={this.handleChange} />

Более чистый подход - поместить интерфейс в отдельный файл.

interface HandleNameChangeInterface {
  target: HTMLInputElement;
}

затем позже используйте следующее определение функции:

  handleChange(event: HandleNameChangeInterface) {
    this.setState({ value: event.target.value });
  }

В моем сценарии использования он однозначно определил, что единственный вызывающий для handleChange - это тип элемента ввода HTML.

Ответ 3

JLRishe ответ правильный, поэтому я просто использую это в своем обработчике событий:

if (event.target instanceof Element) { /*...*/ }

Ответ 4

Машинопись 3.2.4

Для получения свойства вы должны привести цель к соответствующему типу данных:

e => console.log((e.target as Element).id)

Ответ 5

Просто используйте e.currentTarget вместо e.target и он уже будет напечатан соответствующим образом