【问题标题】:Assign an enum as the value of the key of an object type将枚举分配为对象类型的键的值
【发布时间】:2022-01-04 14:19:15
【问题描述】:

下面是我的枚举:

export enum MyEnum {
  Enum1 = 'Enum 1',
  Enum2 = 'Enum 2',
  Enum3 = 'Enum 3',
  Enum4 = 'Enum 4',
  Enum5 = 'Enum 5',
}

我想为如下所示的示例对象创建一个类型:

const testData = {
  test1: {
    Enum1: 'Enum 1',
    Enum2: 'Enum 2',
  },
  test2: {
    Enum1: 'Enum 1',
    Enum2: 'Enum 2',
    Enum3: 'Enum 3',
    Enum4: 'Enum 4',
  },
  test2: {
    Enum1: 'Enum 1',
    Enum2: 'Enum 2',
    Enum4: 'Enum 4',
  },
};

到目前为止,我可以想出:

type FilteredBuyableMethods = {
  [key: string]: Partial<{
    [key in MyEnum]: string
  }>
};

如何将[key in MyEnum]: string 中的string 替换为密钥的确切值?

所以,如果键是Enum1,它的值应该只是'Enum 1'等等。

此外,附加到testData 中可用的键(例如test1test2)的值(具有枚举键和值的对象)应该是来自枚举MyEnum 的值。不一定所有来自枚举 MyEnum 的值都应该存在(部分),但除了枚举键值对之外,不应添加任何随机键值对。感谢期待。

【问题讨论】:

  • 请提供有关约束的更多信息。 Enum 的键和值是否相同?此语法 Enum1 = 'Enum 1' 在对象文字中无效。请分享没有类型错误的可重现示例
  • this 适合你吗?
  • @captain-yossarian 键和值将是相同的。我已经更新了代码。

标签: javascript typescript object types enums


【解决方案1】:

使用Use Enum as restricted key type in TypescriptTypescript: string literal union type from enum 的技巧,您可以按如下方式构造映射类型:

type FilteredBuyableMethods = {
  [key: string]: Partial<{
    [key in keyof typeof MyEnum]: `${typeof MyEnum[key]}`
  }>
};

注意typeof MyEnum[key] 解析为(typeof MyEnum)[key]
(online playground)

这既可以防止错误的键(不是枚举的键),也可以防止错误的值(分别不适合它们的键)。

【讨论】:

  • 这正是我想要的。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-06
  • 1970-01-01
  • 1970-01-01
  • 2019-07-21
  • 2020-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多