【问题标题】:How to use enum values as keys in typescript interfaces?如何使用枚举值作为打字稿接口中的键?
【发布时间】:2019-12-27 06:18:44
【问题描述】:

我正在寻找一种方法来使用枚举的键来定义接口的允许键,你是如何实现的?

http://www.typescriptlang.org/play/index.html#code/KYOwrgtgBA4qAmwBOUDeAoKUIEMA2wUAvFAOS4GkA0mUAZsBYSaQ06egL7roCWIAF2R0cAY0IAFZAGcA9iDS0QOCMABcUaQKT8A5gG5auhMg1adIA1x6j5WqAAdgshwQ1SkckAG0AusShvWlQoZVUNUgBZHCQAT2ooYxBEJAi2fGBSKE4aLBCw9TIAKWQ4hKSUiPZs3LRQlULSItlMqkSTVLJq7l8efiEkEXEoKRcCGCRZMCd4ACFYuGTkRSwAelWoAAkAUQAlbY0AC1kAdygBWSgwaUIBQ8JQSHPLxGlRHQAjW-vAgGtgWL+ABu+DAhHuSGAAH5aN5-rENPDZHRzrEnMjYB1fO4ZPI-NZ0LYQPZ0a5gBMpjN5otKiNnGSKdNgHMFh0AhgsN4acgAHTpAjYxz0gi1JgaUkELhAA

enum Gender {
  male = 'male',
  female = 'female'
}

interface Person {
  name: string;
  gender: string;
}

const people: Person[] = [
  { name: 'Mary', gender: 'female' },
  { name: 'Jerry', gender: 'male' },
  { name: 'Joe', gender: 'male' }
]

interface PeopleGroupedByGender {
  // HERE: how to use the enum to describe the [key] value here?
  [key: keyof typeof Gender]: Person[]
}

const peopleGroupedByGender: PeopleGroupedByGender = {
  [Gender.female]: people,
  male: people
}

【问题讨论】:

  • 请下次通过您帖子中的代码(带有链接),谢谢:)

标签: typescript interface


【解决方案1】:

您收到错误消息:

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

如消息所示,您可以使用mapped object type 解决此问题:

type PeopleGroupedByGender = {
  [key in keyof typeof Gender]: Person[]
}

【讨论】:

  • 因为 typescript 不支持。 reason given 是“映射类型仅在类型别名中受支持。接口和类具有合并语义,这对于映射类型没有多大意义。”
  • 这将键限制为枚举键,而不是枚举键的值。有没有办法做到这一点?假设我有 enum enum SomeOptions { Option1 = "Abc", Option2 = "Xyz" },我想将密钥限制为小写 abc 和 xyz,有没有快速的方法?
猜你喜欢
  • 2017-02-03
  • 2020-12-09
  • 2020-05-09
  • 1970-01-01
  • 2018-09-23
  • 2019-07-09
  • 2022-08-03
  • 2019-09-25
相关资源
最近更新 更多