【发布时间】:2022-01-01 18:38:47
【问题描述】:
我正在尝试定义一个强类型的事件发射器,我最想要的是从传递给addEventHandler 函数的字符串中推断出回调的事件类型。
但到目前为止我失败了,我想出的是从回调中推断事件类型,而不是相反。
这是一个示例(带有fiddle):
interface NumberEvent {
type: 'NumberEvent';
num: number;
}
interface StringEvent {
type: 'StringEvent';
str: string;
}
type AnyEvent = NumberEvent | StringEvent;
const addEventHandler = <ET extends AnyEvent>(type: ET['type'], handler: ((event: ET) => void)) => {
console.log(`added event handler for ${type}`);
}
addEventHandler('NumberEvent', (event: NumberEvent) => {
// this is cool
});
addEventHandler('NumberEvent', (event: StringEvent) => {
// this doesn't type check, good
});
addEventHandler('type does not exist', (x: any) => {
// why no type error?
});
我不明白为什么最后一行要进行类型检查,因为没有 AnyEvent 类型为 'type does not exist' 的实例。
你能想出更好的方法来解决这个问题吗?
【问题讨论】:
-
请参阅my article 它应该会有所帮助。相关问题here和here
-
哦,但是!我之前已经开始阅读您的网站,stackoverflow 是多么的小世界啊!非常感谢,我的待办事项清单上有很多东西要读,但我最终会到达那里。
标签: typescript generics typing