如何在TypeScript中从枚举过滤列表元素?Angular 2场景求教
替代Switch-Case的枚举过滤方案
嘿,我来给你几个更简洁、易维护的方案,替代你现在用的switch-case来过滤列表:
方案1:预存枚举有效值数组 + Array.filter
首先假设你的IProduct接口里有一个对应ProductType的属性(比如type),我们可以先把枚举的有效值存成一个数组,再用filter方法筛选:
// 先定义枚举的有效值集合 const validProductTypes = [ProductType.A, ProductType.B, ProductType.C]; // 过滤列表 const filteredProductList = products.filter(product => validProductTypes.includes(product.type));
这个方案的好处是扩展性极强——以后如果要新增枚举值,只需要在validProductTypes数组里加一项就行,不用修改过滤逻辑,比switch-case清爽多了。
方案2:利用枚举的反向映射自动获取有效值
如果你的枚举不是const enum(或者可以改成普通enum),TypeScript会自动生成双向映射,这时候我们可以用Object.values或Object.keys来自动获取枚举的有效值,不用手动维护数组:
// 先获取枚举的所有数值(过滤掉字符串键的反向映射) const validProductTypes = Object.values(ProductType).filter(val => typeof val === 'number'); // 过滤列表 const filteredProductList = products.filter(product => validProductTypes.includes(product.type));
如果你的产品元素的标识(比如名称)和枚举的键名一致(比如产品A的name属性是'A'),还可以这样写:
// 获取枚举的字符串键(过滤掉数值键) const validProductKeys = Object.keys(ProductType).filter(key => isNaN(Number(key))); const filteredProductList = products.filter(product => validProductKeys.includes(product.name));
为什么这些方案更好?
- 可维护性:新增/删除枚举值时,不用修改过滤逻辑,减少出错概率
- 可读性:代码逻辑一目了然,比一堆case分支更直观
- 简洁性:用数组方法一行搞定过滤,避免冗余代码
注意:如果坚持用
const enum,因为它编译后会被内联替换,Object.values无法直接获取枚举值,这时候方案1的手动数组维护是更稳妥的选择。
内容的提问来源于stack exchange,提问作者user3848036
相关产品推荐
相关产品推荐

