微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决打字稿:如何在接口的字符串索引签名定义中引用属性名称 插图问题

插图

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
}

我想问这个问题吗?

解决方法

实际上您几乎在那里。 eventName保留您想要的类型。

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

Playground Link

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。