TS 通用 "string" 语法的文档

Documentation for TS generic "string" syntax

此语法按预期编译和工作:

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">( 语法不会扰乱我的编译器,但我无法弄清楚定义侦听器的 lambda 表达式需要什么。

任何人都可以举例说明或提供正确的搜索词吗?

有一个让我费解的事情就是如何控制事件是否被消费。 EventListener 的定义是

interface EventListener {
    (evt: Event): void;
}

根据 Basarat 的回答,我尝试指定一个更强的签名,但这与 EventListener 接口不兼容,这就是我查看上面已经发布的定义的原因。

Basarat 提出了完全相同的方法,这让我更加鼓舞,我尝试了这个

    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;
        }
    };

这不再扰乱编译器,但它并不是对转换的巨大改进。

I'd really prefer a strongly typed signature that doesn't require the cast

添加注释:

this.handlerKeyDown = (evt: KeyboardEvent => {

更多

如果您将其内联,编译器将对其进行推断:

window.addEventListener("keydown", (e /* type will be inferred */) => {});