Этот синтаксис компилируется и работает как задумано:
window.addEventListener("keydown", this.handlerKeyDown, false);
...
this.handlerKeyDown = (evt => {
let ke = evt as KeyboardEvent;
console.log("handlerKeyDown saw", ke.key);
return false;
});
но для этого требуется приведение к KeyboardEvent.
Я заметил, что при наведении курсора на метод addEventListener подсказка говорит
(method) Window.addEventListener<"keypress">(type: "keypress",
listener: (this: Window, ev: KeyboardEvent) => any,
options?: boolean | AddEventListenerOptions | undefined): void (+1 overload)
Я бы действительно предпочел строго типизированную подпись, которая не требует приведения, но у меня был черт времени на поиск документации для этого синтаксиса.
Пытаясь угадать, я замечаю, что синтаксис Window.addEventListener<"keypress">(
не расстраивает мой компилятор, но я не могу понять, что он хочет для лямбда-выражения, определяющего слушателя.
Может кто-нибудь объяснить это примером или предоставить правильные условия поиска?
Одна из вещей, которые меня озадачивают, это то, как контролировать, будет ли событие уничтожено. Определение для EventListener
interface EventListener {
(evt: Event): void;
}
В ответе Басарата я пытался указать более сильную подпись, но это было несовместимо с интерфейсом EventListener, поэтому я искал определение, уже опубликованное выше.
Воодушевленный тем, что Басарат придумал точно такой же подход, я попробовал это
this.handlerKeyDown = (ke: Event | KeyboardEvent) => {
if (ke instanceof KeyboardEvent) {
console.log("handlerKeyDown saw", ke.key);
if (this.router && ke.key === "Esc") {
this.router.navigateBack();
}
return true;
}
};
, который больше не расстраивает компилятор, но это не является огромным улучшением приведения.