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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 01:01:22