0

插图

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关键字引用相同的接口!这允许伟大的类型亲和力!它允许很好的打字精度!

从索引签名中引用和获取同一行的属性名称怎么样?

更新

我注意到我刚刚遇到了

索引签名参数类型必须是 'string' 或 'number'.ts(1023)`

错误!

我将代码更改为

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

我会问这个问题吗?

4

1 回答 1

2

你几乎就在那里。eventName持有你想要的类型。

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

游乐场链接

于 2020-10-18T18:10:47.173 回答