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

在TypeScript/JavaScript中能否从函数返回枚举类型?

在TypeScript/JavaScript中从函数返回枚举类型的解决方案

当然可以从函数返回枚举类型,你当前代码报错的核心原因是:默认的数字枚举(Fruit.APPLES值为0、Fruit.ORANGES值为1)和函数返回的字符串类型不兼容,TypeScript不允许不同类型的值直接比较。

下面是具体的修改方案:

方案一:基于数字枚举调整函数逻辑

数字枚举会生成反向映射(比如Fruit[0] = 'APPLES'),所以需要先过滤掉Object.keys(Fruit)中的数字键,再将匹配到的字符串键转换为对应的枚举值:

enum Fruit {
  APPLES,
  ORANGES,
}

// 指定函数返回类型为 Fruit 或空字符串
const findFruit = (arr: string[]): Fruit | '' => {
  return arr.reduce((acc, cur) => {
    // 过滤数字枚举的反向映射键,只保留枚举的字符串键
    const matchedKey = Object.keys(Fruit)
      .filter(key => isNaN(Number(key)))
      .find(item => cur.includes(item));
    
    // 将匹配到的键转换为枚举值,无匹配则保留原累加值
    return matchedKey ? Fruit[matchedKey as keyof typeof Fruit] : acc;
  }, '');
}

此时调用函数后,type的类型为Fruit | '',可以直接和Fruit.APPLES比较:

const type = findFruit(['I like APPLES', 'I love ORANGES']);

if (type === Fruit.APPLES) {
  // 逻辑代码
}

方案二:改用字符串枚举

如果业务允许,将枚举改为字符串枚举会更简洁,因为字符串枚举没有反向映射,枚举值本身就是字符串,和匹配到的键类型完全一致:

// 字符串枚举,值与键名保持一致
enum Fruit {
  APPLES = 'APPLES',
  ORANGES = 'ORANGES',
}

const findFruit = (arr: string[]): Fruit | '' => {
  return arr.reduce((acc, cur) => {
    const matchedKey = Object.keys(Fruit).find(item => cur.includes(item));
    // 直接将匹配到的键断言为枚举类型返回
    return matchedKey ? (matchedKey as Fruit) : acc;
  }, '');
}

这样Fruit.APPLES的值就是字符串'APPLES',和函数返回的字符串类型兼容,比较时不会触发类型错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 00:12:47