簡體   English   中英

如何在 TypeScript 中獲取 Enum 的最小值/最大值

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

游樂場鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM