基于传入值推导函数返回类型的更优TypeScript实现方案
实现枚举值自动推导函数返回类型的TypeScript方案
核心思路
通过枚举-类型映射表将枚举值与对应的返回类型绑定,再利用TypeScript的泛型约束和索引访问类型,让函数根据传入的枚举参数自动推导返回类型,无需手动指定泛型。
完整代码实现
1. 定义基础接口与枚举
// 业务数据接口 interface SummaryData { summary: string; total: number; } interface ConfigurationData { configs: Record<string, string>; version: string; } interface StatusData { status: 'active' | 'inactive'; lastUpdated: Date; } // 视图类型枚举 enum ViewTypeEnums { Summary = 1, Configuration = 2, Status = 3 }
2. 建立枚举与返回类型的映射
// 映射表:枚举值 -> 对应返回类型 type ViewTypeMap = { [ViewTypeEnums.Summary]: SummaryData; [ViewTypeEnums.Configuration]: ConfigurationData; [ViewTypeEnums.Status]: StatusData; };
3. 改造getInfo函数
// 自动推导返回类型的函数 function getInfo<T extends ViewTypeEnums>(type: T): ViewTypeMap[T] { switch (type) { case ViewTypeEnums.Summary: return { summary: '总览统计', total: 150 } as ViewTypeMap[T]; case ViewTypeEnums.Configuration: return { configs: { lang: 'zh-CN' }, version: 'v2.1.0' } as ViewTypeMap[T]; case ViewTypeEnums.Status: return { status: 'active', lastUpdated: new Date() } as ViewTypeMap[T]; default: throw new Error('不支持的视图类型'); } }
调用示例(无需手动指定泛型)
// 自动推导为SummaryData类型 const summaryData = getInfo(ViewTypeEnums.Summary); console.log(summaryData.total); // 类型检查正常通过 // 自动推导为ConfigurationData类型 const configData = getInfo(ViewTypeEnums.Configuration); console.log(configData.version); // 类型检查正常通过 // 自动推导为StatusData类型 const statusData = getInfo(ViewTypeEnums.Status); console.log(statusData.status); // 类型检查正常通过
原理说明
ViewTypeMap显式声明了每个枚举值对应的返回类型,建立了枚举与类型的强关联;- 函数泛型
T约束为ViewTypeEnums的成员,确保传入的参数只能是枚举有效值; - 返回类型
ViewTypeMap[T]通过索引访问类型,根据传入的type参数自动匹配对应的接口类型,TypeScript会完成自动推导。
内容的提问来源于stack exchange,提问作者hyltonw
相关产品推荐
相关产品推荐

