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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:02:30