如何将TypeScript枚举以包含所有枚举值的数组形式传入函数?
解决TypeScript枚举所有值作为数组传入函数的问题
嘿,我明白你的困扰了——直接传EndType枚举对象会报错,因为函数需要的是EndType[]类型的数组,而typeof EndType是枚举的构造类型,两者类型不匹配。下面分情况给你具体解决方案:
1. 区分枚举类型处理
字符串枚举(无反向映射)
如果你的EndType是字符串枚举(每个枚举值都显式赋值为字符串):
enum EndType { Home = 'HOME', Away = 'AWAY', ExtraTime = 'EXTRA_TIME' }
可以直接用Object.values()获取所有枚举值,再断言为EndType[]类型:
getMatchesPicksList(matches, Object.values(EndType) as EndType[]);
字符串枚举不会生成反向映射(比如不会出现EndType['HOME'] = 0这类键值对),所以Object.values()返回的正好是所有枚举值的数组,直接用就行。
数字枚举(带反向映射)
如果是默认的数字枚举(枚举值自动赋值为数字):
enum EndType { Home, Away, ExtraTime }
Object.values()会同时返回数字值和对应的字符串键(TypeScript会为数字枚举生成反向映射),比如返回结果是[0, 1, 2, "Home", "Away", "ExtraTime"],这时候需要过滤掉字符串类型的元素:
const allEndTypes = Object.values(EndType).filter(v => typeof v === 'number') as EndType[]; getMatchesPicksList(matches, allEndTypes);
2. 通用工具函数(兼容所有枚举类型)
如果不想每次都区分枚举类型,可以写一个复用的工具函数,自动提取枚举的有效值:
function getEnumValues<T>(enumObj: T): Array<T[keyof T]> { return Object.values(enumObj).filter(v => typeof v !== 'string') as Array<T[keyof T]>; }
调用的时候直接传枚举对象即可,不管是数字还是字符串枚举都能正确处理:
getMatchesPicksList(matches, getEnumValues(EndType));
适配你的代码场景
结合你给出的getMatchPicks方法:
export const getMatchPicks = (match: IMatch, ends: EndType[]): IPick[] => ends.map(end => matchToPick(match, end));
用上面的方法传入枚举数组后,就能正确遍历所有EndType值,生成对应的IPick数组了。
内容的提问来源于stack exchange,提问作者Edgaras Karka
相关产品推荐
相关产品推荐

