Tengo una enumeración constante en TypeScript, algo como a continuación:
const enum ControlId { ZoomIn = 600, ZoomOut, Close, Open, .... }Dado un número, quiero saber si está dentro del rango de ControlId, que es [600, ?], para poder saber si entra en la categoría de ControlId o no. Me pregunto si hay una manera de hacer eso. Gracias.
Creo que está diciendo que tiene un valor de tiempo de ejecución y desea saber si es un miembro válido de ControlId (ha dicho que desea una "verificación de rango", pero las enumeraciones numéricas no son necesariamente contiguas).
Una const enum no existe en tiempo de ejecución, por lo que no puede escribir código de tiempo de ejecución para validar un número y ver si es un miembro válido de una const enum .
Puedes hacerlo si la enum no es 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}`); } } Allí lo he hecho como una función de aserción de tipos, pero en su lugar podría ser una función de protección de tipos, o simplemente una expresión en línea. Básicamente, si el valor es un número y el valor (cuando se convierte en cadena, implícitamente por el operador in ) es un nombre de propiedad válido para ControlId , es un miembro válido de ControlId .
Si realmente quiere decir que desea el mínimo / máximo, aunque no se garantiza que los valores de enumeración sean contiguos, puede hacerlo así:
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]]; } (Probablemente haya un mejor tipo para e que object . Y en entornos modernos, values[values.length - 1] podría ser values.at(-1) .
Eso obtiene todas las claves del objeto que pasa, las convierte en números si es posible, elimina las que no se convirtieron correctamente (por lo que ahora tenemos una matriz de valores de enumeración), ordena la matriz resultante y devuelve la primera y últimos elementos de la matriz.
Alternativamente, use Math.min y Math.max en lugar de ordenar:
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)]; }