TypeScript中如何判断参数是枚举值还是枚举值数组?
正确判断枚举值与枚举值数组的方法
你遇到的错误根源在于:字符串枚举的成员本质是字符串类型,instanceof仅能用于判断类/构造函数的实例,枚举并不满足这个条件,因此无法通过它来判断。另外你代码里还有个笔误——条件中的settingType应该是settingTypes(少了末尾的s)。
下面是修正后的完整代码,同时兼顾合法性验证:
export enum SettingType { hairColors = 'haircolors', hatSizes = 'hatsizes' } public getSettings(settingTypes: SettingType | SettingType[]) { // 第一步:判断是否为数组 if (Array.isArray(settingTypes)) { // 处理多枚举值场景 settingTypes.forEach(type => { // 可选:验证元素是否为合法枚举值 if (Object.values(SettingType).includes(type)) { // 在此编写单类型数据获取逻辑 } }); } else { // 处理单枚举值场景 // 可选:验证值是否为合法枚举值 if (Object.values(SettingType).includes(settingTypes)) { // 在此编写单类型数据获取逻辑 } } } public theUsage() { this.getSettings(SettingType.hairColors); this.getSettings([SettingType.hairColors, SettingType.hatSizes]); }
关键说明
- 用
Array.isArray()判断数组是最可靠的方式,避免了其他判断方法的兼容性问题。 - 由于你使用的是字符串枚举,
Object.values(SettingType)会返回所有枚举成员的字符串值数组(['haircolors', 'hatsizes']),因此可以用includes()验证传入值的合法性,防止非法字符串传入。 - 如果是数字枚举,
Object.values()会同时包含枚举的键和数值,此时可以结合typeof判断类型,比如typeof settingTypes === 'number' && Object.values(SettingType).includes(settingTypes)。
内容的提问来源于stack exchange,提问作者Tom Smykowski
相关产品推荐
相关产品推荐

