[英]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.