【问题标题】:Typescript: Is it possible to type an array to include every key of an enum打字稿:是否可以键入一个数组以包含枚举的每个键
【发布时间】:2020-09-21 13:02:52
【问题描述】:

是否可以强制枚举数组包含 EPostFromField 枚举的每一个值?

这是一个 mongodb 模式,如果以后添加更多枚举,用例将用于验证枚举字段(即:让编译器抛出错误,因为数组没有枚举所有枚举值) .

作为奖励,我想下一个级别将是一个解决方案,它还保证枚举数组值是唯一的:)

export const enum EPostFromField {
  Resident = 'resident',
  AdminUser = 'admin-user', // Admin <user name>
  BoardUser = 'board-user', // Board <user name>
  AdminSociety = 'admin-society', // Admin <community name>
  BoardSociety = 'board-society', // Board <community name>
}

showPostAs: {
    type: String,
    default: EPostFromField.Resident,
    enum: [
      EPostFromField.Resident,
      EPostFromField.AdminUser,
      EPostFromField.BoardUser,
      EPostFromField.AdminSociety,
      EPostFromField.BoardSociety,
    ] as EPostFromField[], // DEVNOTE: Improve typing to enforce *every* unique key of enum
  },

【问题讨论】:

  • 枚举对象和所有对象一样,具有不同的"Resident" 是一个,但EPostFromFileld.Resident 是它的。您谈到想要保证唯一的 keys,但您正在制作一个 values 数组。当您的意思是“价值”时,您是否使用了“键”这个词?如果没有,我很困惑;你能详细说明一下吗?
  • @jcalz 是的。对不起混淆。最终目标是让 mongodb 枚举字段包含(因此只接受)枚举 EPostFromField 的值。谢谢你,我会编辑这个问题。

标签: arrays typescript enums


【解决方案1】:

您可以定义 string enum 并执行以下操作:

enum EPostFromField {
    Resident = "Resident",
    AdminUser = "AdminUser",
    BoardUser = "BoardUser",
    AdminSociety = "AdminSociety",
    BoardSociety = "BoardSociety"
}

const epostFromFieldKeys = Object.keys(EPostFromField);

const epostFromFields = epostFromFieldKeys as EPostFromField[]

您可以在 playground link 中看到它正在运行。

如果您在枚举中唯一地定义字符串值(!),则数组中的值将是唯一的。

【讨论】:

  • 谢谢本!是的,实际上这回答了我的问题 :) 然而,我正在寻找更简洁的东西。以 typescript Partial&lt;T&gt; 实用程序类型为例,我希望在这些方面有更多的东西(但不是部分匹配,而是完全 + 强制 + 唯一匹配)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-29
  • 2017-04-01
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多