You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将any值转换为TypeScript Enum并抛出非法值异常的最佳实践

最优实现方案:通用泛型枚举转换函数

你可以通过定义一个通用的泛型工具函数,实现一次编写、所有枚举场景复用,无需为每个枚举单独维护转换逻辑,同时规避@ts-ignore脏代码,保证类型安全。

核心实现代码

/**
 * 将任意值转换为指定枚举类型,值不合法时直接抛出异常
 * @param enumObj 目标枚举对象
 * @param value 待转换的任意值
 * @returns 类型安全的枚举成员
 */
function castToEnum<T extends object>(enumObj: T, value: any): T[keyof T] {
  const validValues = Object.values(enumObj);
  if (!validValues.includes(value)) {
    throw new Error(`Invalid enum value: ${JSON.stringify(value)}, expected one of [${validValues.join(', ')}]`);
  }
  // 已提前校验值合法性,此处断言完全安全
  return value as T[keyof T];
}

实际使用示例

针对你给出的业务场景,使用方式如下:

enum OPTIONS_ENUM {
  a = 'a',
  b = 'b'
}

function handleRequest(req: Request): OPTIONS_ENUM {
  // 直接调用通用转换函数即可,返回值自动匹配OPTIONS_ENUM类型
  return castToEnum(OPTIONS_ENUM, req.query?.option);
}

方案优势

  • 全局复用:仅需定义一次,所有字符串/数字/异构枚举都可以直接使用
  • 类型安全:无@ts-ignore注释,返回值自动推断为对应枚举的成员类型
  • 维护成本低:合法值列表自动从枚举读取,无需手动同步更新
  • 适配性强:兼容undefined、null、字符串、数字等各类入参场景

可选变体:带默认值的转换

如果不需要抛出异常,希望非法值返回默认值,可以使用以下变体函数:

function castToEnumOrDefault<T extends object>(enumObj: T, value: any, defaultValue: T[keyof T]): T[keyof T] {
  const validValues = Object.values(enumObj);
  return validValues.includes(value) ? (value as T[keyof T]) : defaultValue;
}

内容的提问来源于stack exchange,提问作者Austio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 16:36:00