在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
相关产品推荐
相关产品推荐

