Комментарии 2
можно твердо утверждать, что если событие пользовательского интерфейса вызвано не искусственно (является isTrusted), то target будет являться как минимум Node. Если же искусственно, то оно будет идентично currentTarget. (просьба поправить (ну или привести пример, доказывающий обратное), если в этих рассуждениях есть прокол).
Напомню что target - это изначальный источник события, а currentTarget - текущий. Разница между ними в том, что тот же click мог быть инициирован на одном из вложенных элементов, а обрабатывать его мы можем гораздо выше по дереву. Такой сценарий никоим образом отработать на уровне типов не получится, поэтому мы можем быть точно уверены только в типе curentTarget (как сделано например и в реакте).
Все так. Однако есть некоторая закономерность, на примере того же клика: если click
вызван искусственно (через dispatchEvent
), то target
эвента всегда равен currentTarget
(иными словами, если эвент вызван window.dispatchEvent(...)
, то егоtarget
- это всегда объект Window
, если new EventTarget().dispatchEvent(...)
, то target
- это всегда EventTarget
, и так далее). Если же он вызван нативно (кликом пользователя), то в иерархии наследования типов target
будет как минимум объектом, наследованным отElement
( HTMLElement
, SVGElement
и тому подобное).
При чем искусственно вызванноеnew MouseEvent('click')
на голом EventTarget
никогда не всплывет ни до Window
, ни до какого другого элемента (что логично и не требует объяснений). А вот оно же вызванное на Node
, добавленной в document
, уже может. Таким образом мы имеет, что в прослушиватель события пользовательского интерфейса, вызванного на каком-либо элементе, прилетит target
, унаследованный как минимум от Node
. Вызванного на Window
- это Window
либо [объект,] унаследованный как минимум от Node
, в Document
- это Document
либо [объект,] унаследованный как минимум от Node
. На мой взгляд, понимание этого может сделать код более типобезопасным.
PS: поправьте меня, если в моих рассуждениях есть какая-то червоточина
ts-reset и types-spring