Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 将方法签名限制为仅允许事件映射中定义的类型的有效负载_Typescript_Publish Subscribe - Fatal编程技术网

Typescript 将方法签名限制为仅允许事件映射中定义的类型的有效负载

Typescript 将方法签名限制为仅允许事件映射中定义的类型的有效负载,typescript,publish-subscribe,Typescript,Publish Subscribe,我正在开发一个事件(发布/订阅)系统,我需要预先定义事件和有效负载。无法将publish方法限制为事件、事件[PAYLOAD] //这是我最接近的,但它不起作用: 上课{ 发布(eventName:eventName,负载:EVENT_-MAP[eventName]){} } 枚举事件{ 你好 世界 } 类型事件\u签名={ [活动,你好]:{ messageId:string }, [事件.世界]:{ 年龄:数目 } } //这不符合预期。我做错了什么? const someClass=新的s

我正在开发一个事件(发布/订阅)系统,我需要预先定义事件和有效负载。无法将
publish
方法限制为事件、事件[PAYLOAD]

//这是我最接近的,但它不起作用:
上课{
发布(eventName:eventName,负载:EVENT_-MAP[eventName]){}
}
枚举事件{
你好
世界
}
类型事件\u签名={
[活动,你好]:{
messageId:string
},
[事件.世界]:{
年龄:数目
}
}
//这不符合预期。我做错了什么?
const someClass=新的someClass();
//以下是我期望它如何工作:
发布(EVENTS.HELLO,{messageId:123})/=>错误。应为字符串
发布(EVENTS.HELLO,{messageId:“123”,年龄:15});//=>错误。年龄不应该在这里
publish(EVENTS.HELLO,{messageId:'123'})/=>很好
发布(EVENTS.WORLD,{messageId:'123'})/=>错误。messageId不在类型上
someClass.publish(EVENTS.WORLD,{age:123})/=>good
//下面是实际发生的情况
发布(EVENTS.HELLO,{messageId:123});//=>错误。应为字符串
发布(EVENTS.HELLO,{messageId:“123”,年龄:15});好的
发布(EVENTS.HELLO,{messageId:“123”});//=>好的
发布(EVENTS.WORLD,{messageId:“123”});//=>好的
someClass.publish(EVENTS.WORLD,{age:123});//=>好的
这是typescript推断的签名:

(方法)SomeClass.publish(事件名称:事件,负载:{
messageId:string;
} | {
年龄:人数;
}):无效
而我需要将负载限制为EVENTNAME

这里还有一个沙箱:


提前谢谢

尝试将发布设置为通用,以记住传入的
eventName

class SomeClass<EVENT_MAP> {
    publish<EVENTNAME extends keyof EVENT_MAP>(eventName: EVENTNAME, payload: EVENT_MAP[EVENTNAME]) {}
}
class-SomeClass{
发布(eventName:eventName,负载:EVENT_-MAP[eventName]){}
}

就是这样。非常感谢。