Fab*_*ice 7 javascript casting type-conversion typescript
即使代码运行完美,我也会遇到以下错误:
"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;
//...
}
Run Code Online (Sandbox Code Playgroud)
我试图将事件类型定义为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'.
Run Code Online (Sandbox Code Playgroud)
有没有办法解决或解决问题?
TypeScript 无法在这里实现全面飞跃,因为它只知道事件名称将是一个字符串,因此使用了最通用的事件类型。
下面的示例转换为一个独立的运行示例 - 所以我已经把东西“从课堂上”拿出来进行演示......
虽然字符串是keydown
,keyup
你可以保证类型安全,并否决编译器:
let listenTo = (window: Window) => {
['keydown', 'keyup'].forEach(eventName => {
window.addEventListener(eventName, e => {
handleEvent(<any>e);
});
});
}
let handleEvent = (event: KeyboardEvent) => {
const { key } = event;
//...
}
Run Code Online (Sandbox Code Playgroud)
如果将其他一些字符串添加到您的事件名称数组中,这将下降。
由于专门的签名,直接使用字符串时可以使用完全类型安全:
window.addEventListener('keydown', e => {
handleEvent(e); // e is KeyboardEvent
});
Run Code Online (Sandbox Code Playgroud)
因此,您可以更强烈地键入数组以获得正确的类型优点:
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;
//...
}
Run Code Online (Sandbox Code Playgroud)
在最后一个示例中,我们将数组中元素的类型限制为仅键盘事件名称,因此编译器现在知道它不仅仅处理任何旧字符串,并且可以推断事件类型。
字符串'keyup'
和'keydown'
是已知的字符串文字类型。但是,代码中的字符串不是用于检查已知字符串文字类型的候选字符串,除非它们是const
。只需让你的保持不变:
public listenTo = (window: Window) => {
['keydown' as const, 'keyup' as const].forEach(eventName => {
window.addEventListener(eventName, e => {
this.handleEvent(e);
});
});
}
Run Code Online (Sandbox Code Playgroud)
或者
public listenTo = (window: Window) => {
(['keydown', 'keyup'] as const).forEach(eventName => {
window.addEventListener(eventName, e => {
this.handleEvent(e);
});
});
}
Run Code Online (Sandbox Code Playgroud)
取决于你的口味。
归档时间: |
|
查看次数: |
6084 次 |
最近记录: |