TS generic" string"的文档句法

时间:2018-04-29 23:26:32

标签: typescript addeventlistener typescript-generics

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

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

不再扰乱编译器,但它对演员阵容没有太大的改进。

1 个答案:

答案 0 :(得分:0)

  

我真的更喜欢不需要演员的强类型签名

添加注释:

keys_to_remove = []
for k1, v1 in d.items():
    for k2, v2 in d.items():
        if k1 == k2:
            continue
        dist1 = float(v1[1])
        dist2 = float(v2[1])
        if abs(dist1 - dist2) <= 1:
            keys_to_remove.append(k2)
result = d.copy()
for k in keys_to_remove:
    result.pop(k)
print(result)

更多

编译器会推断它是否内联:

this.handlerKeyDown = (evt: KeyboardEvent => {