Typescript 键盘事件:“Event”类型的参数不可分配给“KeyboardEvent”类型的参数

2024-03-30

即使代码完美运行,我也会出现以下错误:

"TS2345: Argument of type 'Event' is not assignable to parameter of type 'KeyboardEvent'.
  Property 'altKey' is missing in type 'Event'." 

// In a Class

public listenTo = (window: Window) => {
  ['keydown', 'keyup'].forEach(eventName => {
     window.addEventListener(eventName, e => {
       this.handleEvent(e); // <- error here
     });
   });
}

public handleEvent = (event: KeyboardEvent) => {
    const { key } = event;
    //...
}

我尝试将事件类型定义为 KeyboardEvent,但出现以下错误:

 window.addEventListener(eventName, (e:KeyboardEvent) => {
           this.handleEvent(e); // <- error here
         });


 TS2345: Argument of type '(event: KeyboardEvent) => void' is not assignable to parameter of type 'EventListenerOrEventListenerObject'.
  Type '(event: KeyboardEvent) => void' is not assignable to type 'EventListenerObject'.
 Property 'handleEvent' is missing in type '(event: KeyboardEvent) => void'.

有没有办法渡过或者解决这个问题?


TypeScript 无法在这里实现全面飞跃,因为它只知道事件名称将是一个字符串,因此使用最通用的事件类型。

下面的示例转换为独立运行的示例 - 因此我将“从类中”取出来进行演示......

虽然字符串是keydown and keyup你可以保证类型安全,并否决编译器:

let listenTo = (window: Window) => {
  ['keydown', 'keyup'].forEach(eventName => {
     window.addEventListener(eventName, e => {
       handleEvent(<any>e);
     });
   });
}

let handleEvent = (event: KeyboardEvent) => {
    const { key } = event;
    //...
}

如果将其他字符串添加到事件名称数组中,则这会失败。

由于专门的签名,直接使用字符串时可以实现完整的类型安全:

  window.addEventListener('keydown', e => {
     handleEvent(e); // e is KeyboardEvent
  });

因此,您可以更严格地键入数组以获得正确的类型优点:

type KeyboardEventNames = 'keydown' | 'keyup';

let listenTo = (window: Window) => {
  const eventNames: KeyboardEventNames[] = ['keydown', 'keyup']; 
  eventNames.forEach(eventName => {
     window.addEventListener(eventName, e => {
       handleEvent(e);
     });
  });
}

let handleEvent = (event: KeyboardEvent) => {
    const { key } = event;
    //...
}

在最后一个示例中,我们将数组中的元素类型限制为仅键盘事件名称,因此编译器现在知道它不仅仅处理任何旧字符串,并且可以推断事件类型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Typescript 键盘事件:“Event”类型的参数不可分配给“KeyboardEvent”类型的参数 的相关文章

随机推荐