打字稿:如何在接口中的字符串索引签名定义中引用 属性 名称

Typescript: How to reference property name in an string index signature definition in an interface

插图

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
}

亲和力极强!有什么办法吗?

为了更好地理解,我将采用下面的代码片段!

export interface IEventDef {
    ready: any,
} 

export interface IIPCMessage {
    eventType: keyof IEventDef,
    data: IEventDef[this['eventType']] // <<= here
}

在该示例中,我能够使用 this 关键字引用相同的界面!这让类型亲和力很大!而且打字精度很高!

如何从索引签名中引用并获取同一行的 属性 名称?

更新

我注意到我刚遇到

An index signature parameter type must be either 'string' or 'number'.ts(1023)`

错误!

然后我将代码更改为

type IMessageHandlers = {
    [eventName in keyof IEventDef]: (data: /*REF_THE_PROP_NAME?*/) => void
}

我要回答这个问题吗?

实际上你快到了。 eventName 拥有你想要的类型。

type IMessageHandlers = {
    [eventName in keyof IEventDef]: (data: eventName) => void
}

Playground Link