【问题标题】:Typescript: How to reference property name in an string index signature definition in an interface打字稿:如何在接口中的字符串索引签名定义中引用属性名称
【发布时间】: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


【解决方案1】:

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

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

Playground Link

【讨论】:

  • 我就在那儿!我尝试过这个 !但是,它是在接口案例中!在接口情况下我们没有!这是有道理的!我忘记了仅字符串错误!除非他们添加对 in 的支持和对文字的支持!我们无能为力!简而言之,这可以通过in 语法实现!我们可以在对象字面量中使用它!我们在接口上错过了这一点!有考虑! github.com/microsoft/TypeScript/issues/5683!它可能在未来的某个地方产卵!非常感谢先生!如果有更多想法,将不胜感激!
  • 对于接口和字面支持的问题!我们总是可以生成接口!我们也可以有一个插件!通过使用 AST(ts-morph 是一个不错的选择)。
猜你喜欢
  • 1970-01-01
  • 2015-05-16
  • 2020-02-19
  • 1970-01-01
  • 2019-09-21
  • 2018-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多