【问题标题】:Mapped type on methods方法上的映射类型
【发布时间】:2018-05-15 23:53:17
【问题描述】:

我正在尝试创建一个对象类型来定义另一种类型的值。

我本来就有这个:

export interface Obj {
  [key: string]: any
}

我现在想将其更改为包含其他类型的项目列表。我尝试了以下方法,但出现错误:

索引签名参数类型不能是联合类型。考虑改用映射对象类型。

type ListOfMethods = {
  one(): void
  two(): void
}

export interface Obj {
  [key: keyof ListOfMethods]: any
}

所以我尝试了这个错误:

[key in keyof ListOfMethods]: any

现在得到这个错误

计算属性名称的类型必须为“字符串”、“数字”、“符号”或“任意”。

【问题讨论】:

  • type = ListOfMethods 必须是 type ListOfMethods :)
  • 已修复,这是一个错字:)
  • 在实际代码中,ListOfMethods 类型只是传递给addEventListener 的事件列表,其中名称是键,函数是事件,所以如果有内置方式将这些名称列为函数......那会很好......
  • type names = "one" | "two" | "three"; 然后{[key in names]: () => void}
  • @JonasW。这个对吗? export interface Obj {[key in names]: () => void}?如果是这样,我会收到错误消息:'Obj' only refers to a type, but is being used as a value here.

标签: javascript typescript typescript-typings


【解决方案1】:

您必须将Obj 定义为:

export type Obj = {
  [key in keyof ListOfMethods]: any
}

如果使用:,则表示键的类型,键的类型只能是numberstring

keyof 创建一个string 的子类型,它只承认其中的值是参数对象的属性。在这种情况下,keyof ListOfMethods'one' | 'two'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 2012-02-20
    相关资源
    最近更新 更多