如何在 TypeScript 中获取 Enum 的 min/max 值

How to get the min/max value of Enum in TypeScript

我在 TypeScript 中有一个常量枚举,如下所示:

const enum ControlId {
   ZoomIn = 600,
   ZoomOut,
   Close, 
   Open,
   ....
}

给定一个数字,我想知道它是否在ControlId的范围内,即[600, ?],这样我就可以知道它是否属于ControlId的范畴。我想知道是否有办法做到这一点。谢谢

我想你是说你有一个 runtime 值,你想知道它是否是 ControlId 的有效成员(你说过你想要一个“范围检查”,但数字枚举不一定连续)。

A const enum 在运行时不存在,因此您无法编写运行时代码来验证数字是否为 const enum.

的有效成员

如果 enum 不是 const,您可以这样做:

enum ControlId {
    ZoomIn = 600,
    ZoomOut,
    Close, 
    Open,
    // ....
}

function assertIsControlId(value: number): asserts value is ControlId {
    if (!(value in ControlId)) {
        throw new Error(`Invalid ControlId value ${value}`);
    }
}

我已经把它作为一个类型断言函数来完成,但这可能是一个类型保护函数,或者只是一个内联表达式。基本上,如果该值是一个数字,并且该值(当由 in 运算符隐式转换为字符串时)是 ControlId 的有效 属性 名称,则它是 ControlId.

如果你真的想要 min/max,即使不保证枚举值是连续的,你也可以这样做:

function getMinMaxOfEnum(e: object) {
    const values = Object.keys(e).map(k => k === "" ? NaN : +k).filter(k => !isNaN(k)).sort((k1, k2) => k1 - k2);
    return [values[0], values[values.length - 1]];
}

e 的类型可能比 object 更好。在现代环境中,values[values.length - 1] 可能是 values.at(-1)。)

从您传入的对象中获取所有键,如果可能,将它们转换为数字,删除未成功转换的键(因此现在我们有一个枚举值数组),对结果数组进行排序, 和 returns 数组的第一个和最后一个元素。

或者,使用 Math.minMath.max 而不是排序:

function getMinMaxOfEnum(e: object) {
    const values = Object.keys(e).map(k => k === "" ? NaN : +k).filter(k => !isNaN(k));
    return [Math.min(...values), Math.max(...values)];
}

Playground link