TypeScript:是否可以将数组键类型化为枚举中的每个键?

3

有没有可能以一种方式输入枚举数组,强制它包含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
  },

可能是强制一个数组对于联合类型是完备的的重复问题。 - undefined
1
枚举对象,就像所有对象一样,都有不同的"Resident"是一个,而EPostFromFileld.Resident是它的。你谈论着想要确保唯一的,但你正在创建一个的数组。你是在用“键”这个词来指代“值”吗?如果不是,我有点困惑;你能详细解释一下吗? - undefined
@jcalz 是的。对混淆感到抱歉。最终目标是让mongodb枚举字段包含(并且只接受)enum EPostFromField的值。谢谢,我会编辑问题。 - undefined
1个回答

5
你可以定义一个字符串枚举并执行以下操作:
enum EPostFromField {
    Resident = "Resident",
    AdminUser = "AdminUser",
    BoardUser = "BoardUser",
    AdminSociety = "AdminSociety",
    BoardSociety = "BoardSociety"
}

const epostFromFieldKeys = Object.keys(EPostFromField);

const epostFromFields = epostFromFieldKeys as EPostFromField[]

你可以在playground link中查看此内容的运行情况。
如果您在枚举中唯一地定义字符串值,那么数组中的值将是唯一的。

谢谢Ben!是的,实际上这回答了我的问题 :) 不过我还在寻找更简洁的解决方案。以typescript中的Partial<T>工具类型为例,我希望有一个更符合以下要求的解决方案(不仅仅是部分匹配,而是完整+必需+唯一匹配)。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接