【问题标题】:Use computed values on enums在枚举上使用计算值
【发布时间】:2020-11-08 16:54:59
【问题描述】:

我有以下情况:

enum T {
    A = "a"
};

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

我收到此错误:

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

有办法解决吗?或者也许使用可以让我有类似行为的类似资源?

【问题讨论】:

  • 为了清楚起见,您希望它是U.a,因为这是T.A 而不是U.A,因此它与@ 具有相同的键987654325@?
  • 是的,希望它是U.a

标签: typescript enums


【解决方案1】:

一个选项,虽然不一定理想,是使用来自 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];

这是为了确保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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    相关资源
    最近更新 更多