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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:37:27