此语法按预期编译和工作:
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;
}
};
不再扰乱编译器,但它对演员阵容没有太大的改进。
答案 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 => {