TypeScript中如何简化枚举类型断言的重复代码?
简化TypeScript枚举分支重复代码方案
问题背景
定义枚举:
enum FilterType { Number = 'number', Text = 'text', Other = 'other', }
编写的switch分支代码重复度极高,仅类型断言部分存在差异:
switch(filterType) { case FilterType.Number: return createFilter(name, filter as Filter<FilterType.Number>); case FilterType.Text: return createFilter(name, filter as Filter<FilterType.Text>); case FilterType.Other: return createFilter(name, filter as Filter<FilterType.Other>); }
尝试用filter as Filter<filterType>简化失败,原因是TypeScript不允许用变量值替代类型。
解决方案
方案1:抽离泛型辅助函数
将重复的createFilter调用逻辑封装为泛型函数,利用TypeScript自动推断类型的特性,在分支中复用:
const createTypedFilter = <T extends FilterType>(type: T, name: string, filter: unknown) => { return createFilter(name, filter as Filter<T>); }; // 简化后的switch switch(filterType) { case FilterType.Number: return createTypedFilter(filterType, name, filter); case FilterType.Text: return createTypedFilter(filterType, name, filter); case FilterType.Other: return createTypedFilter(filterType, name, filter); }
方案2:将外层函数改为泛型函数
若该switch属于某个函数,直接将其声明为泛型函数,彻底消除分支重复:
function resolveFilter<T extends FilterType>(filterType: T, name: string, filter: Filter<T>) { return createFilter(name, filter); }
调用时,TypeScript会根据传入的filterType具体值自动推断泛型参数,确保类型匹配,无需手动编写switch分支。
方案3:映射类型关联值与类型
先定义枚举值到对应Filter类型的映射,再通过泛型函数实现类型安全调用:
type FilterTypeMap = { [FilterType.Number]: Filter<FilterType.Number>; [FilterType.Text]: Filter<FilterType.Text>; [FilterType.Other]: Filter<FilterType.Other>; }; function createFilterByType<T extends FilterType>(type: T, name: string, filter: FilterTypeMap[T]) { return createFilter(name, filter); } // 直接调用即可,类型自动匹配 return createFilterByType(filterType, name, filter as FilterTypeMap[typeof filterType]);
内容的提问来源于stack exchange,提问作者Guang
相关产品推荐
相关产品推荐

