如何在 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.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)];
}
我在 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.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)];
}