对枚举使用计算值



我有以下情况:

enum T {
A = "a"
};
enum U {
[T.A] = "u"
}

我得到这个错误:

枚举中不允许使用计算的属性名称。

有办法解决它吗?或者使用类似的资源,让我有类似的行为?

一个选项虽然不一定理想,但是使用T枚举中的显式值,然后使用伪类型定义进行一些编译时断言:

enum T {
A = "a"
};
enum U {
// T.A
a = "u"
}
/** this raises a compile error if not all values of enum T are valid keys of the enum U */
type _ensure_keyof_U_equals_T = typeof U[T];

请注意,您实际上不会在代码中的任何其他地方使用_ensure_keyof_U_equals_T,它只是在枚举与您想要的形状不匹配时抛出类型错误。

这是为了确保类型为T的值可以用作在运行时创建的U对象的动态键。请注意,枚举的优点之一是使它们成为const,这不是这种架构的选项。

另一种选择是将U作为对象定义,而不是像下面这样的枚举:

type U = (typeof U)[keyof typeof U]
const U = {
[T.A]: "u"
} as const

这并没有断言T的每个可能元素都是有效的键(尽管上面使用的断言仍然有效(,但确实创建了一个与枚举几乎无法区分的对象/类型组合,唯一的区别是对字符串文字的检查不那么严格:

enum A {
a = "b"
}
type B = (typeof B)[keyof typeof B];
const B = {
element: "b"
} as const
function should_only_accept_enum_A(item: A){}
function should_only_accept_enum_B(item: B){}
should_only_accept_enum_A("b") // fails
should_only_accept_enum_B("b") // succeeds

最新更新