¿Existe una manera fácil/mejor práctica de convertir any valor en una enumeración de TypeScript y lanzar una excepción si no hay ningún valor?
Como ejemplo
Tiene un objeto de solicitud expresa y está utilizando el valor query.option . Su aplicación sabe que solo tiene dos estados válidos a|b. Sin embargo, la realidad de Internet y el objeto de solicitud es que pueden ser muchas cosas (indefinido, a, b, foo).
enum OPTIONS_ENUM { a = 'a', b = 'b' } function handleRequest(req: Request): OPTIONS_ENUM { // This will error because query.option is an any return OPTIONS_ENUM[req.query?.option] }Lo que he estado haciendo parece un poco detallado. Tengo una función de "transmisión" al lado de cada enumeración que arrojará si ENUM no tiene un valor.
function castToOptionsEnum(option: any): OPTIONS_ENUM { if (!Object.values(OPTIONS_ENUM)?.includes(option)) { throw new Error(`Invalid Value for option, must be one of ${Object.values(OPTIONS_ENUM)}`) } // @ts-ignore return OPTIONS_ENUM[option] } function handleRequest(req: Request) { // This will error because the option query is unknowable return castToOptionsEnum(req.query?.option) }puede "simplemente" enviar la option a OPTIONS_ENUM al acceder a OPTIONS_ENUM en castToOptionsEnum :
function castToOptionsEnum(option: any): OPTIONS_ENUM { if (!Object.values(OPTIONS_ENUM)?.includes(option)) { throw new Error(`Invalid Value for option, must be one of ${Object.values(OPTIONS_ENUM)}`); } return OPTIONS_ENUM[option as OPTIONS_ENUM]; } Esto eliminará cualquier error de compilación (sugeriría eliminar // @ts-ignore también, ya que "oculta" los errores de compilación, pero eso depende de usted ^^).