【发布时间】:2023-03-11 10:34:01
【问题描述】:
插图
export interface IEventDef {
ready: any,
}
export interface IIPCMessage {
eventType: keyof IEventDef,
data: IEventDef[this['eventType']]
}
interface IMessageHandlers {
[eventName: keyof IEventDef]: (data: ) => void
}
问题
根据插图为接口提供字符串索引签名! 如下:
interface IMessageHandlers {
[eventName: keyof IEventDef]: (data: /*HOW_TO_REF_eventName*/) => void
}
在我的示例中,我们如何引用eventName?或索引属性名称!同一行
在我的确切代码中,我想这样做:
interface IMessageHandlers {
[eventName: keyof IEventDef]: (data: IEventDef[thisLineProp]) => void
}
这会产生很大的亲和力!有什么办法吗?
为了更清楚,我将在下面这个sn-p!
export interface IEventDef {
ready: any,
}
export interface IIPCMessage {
eventType: keyof IEventDef,
data: IEventDef[this['eventType']] // <<= here
}
在该示例中,我能够使用 this 关键字引用相同的接口!这允许伟大的类型亲和力!而且它允许很好的打字精度!
从索引签名中引用和获取同一行的属性名称怎么样?
更新
我注意到我刚刚遇到了
索引签名参数类型必须是'string'或'number'.ts(1023)`
错误!
我把代码改成了
type IMessageHandlers = {
[eventName in keyof IEventDef]: (data: /*REF_THE_PROP_NAME?*/) => void
}
我会问这个问题吗?
【问题讨论】:
-
你能提供一个你想如何使用它的例子吗?从无效类型中不清楚预期的结果是什么。如果到目前为止我理解了这个问题,那么如果您将
/*REF_THE_PROP_NAME?*/替换为eventName(假设您希望data与键名相同),那么您的最后一个示例非常接近 -
是的,那是什么!我想在第二部分使用与属性相同的名称!所以从使用角度来说!选择对象属性时!映射的元素将自动推断出它的类型,并且正确且精确!正如你所提到的!我只需要使用
eventName!但是一开始我试过了,但是在界面中!并使用文字字符串!他们只是不支持!而且我没有尝试使用in语法。那是我的错hhh!关于我们何时需要接口的任何想法!?除了代码生成!非常感谢楼主
标签: string typescript properties reference index-signature