[英]How to get the min/max value of Enum in TypeScript
我在 TypeScript 中有一个 const 枚举,如下所示:
const enum ControlId {
ZoomIn = 600,
ZoomOut,
Close,
Open,
....
}
给定一个数字,我想知道它是否在ControlId的范围内,即[600,?],这样我就可以知道它是否属于ControlId的范畴。 我想知道是否有办法做到这一点。 谢谢。
我认为您是在说您有一个运行时值,并且您想知道它是否是ControlId
的有效成员(您说过您想要“范围检查”,但数字枚举不一定是连续的)。
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
有效成员。
如果您真的想要最小/最大值,即使不能保证枚举值是连续的,您也可以这样做:
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)
。)
从您传入的对象中获取所有键,如果可能,将它们转换为数字,删除未成功转换的键(所以现在我们有一个枚举值数组),对结果数组进行排序,并返回第一个和数组的最后一个元素。
或者,使用Math.min
和Math.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)];
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.