如何将TypeScript枚举作为对象属性键并解决类型报错问题
解决TypeScript枚举值作为对象键的索引类型报错问题
问题原因
for...in循环遍历对象时,迭代变量默认被推断为string类型,但你的comparisons对象键是TaskType枚举的字符串值(属于TaskType类型),string类型无法直接用来索引该对象,因此触发类型报错。你之前尝试的taskType as keyof TaskType无效,是因为keyof TaskType对应的是枚举的键名(比如"Classification"),而非枚举的实际值("classification"),两者类型不匹配。
解决方案
方案1:通过Object.keys断言类型后遍历
export enum TaskType { Classification = 'classification', Extraction = 'extraction' } // 用Record简化类型定义,和{ [name in TaskType]: Function }等价 const comparisons: Record<TaskType, Function> = { 'classification': () => false, 'extraction': () => false } // 将Object.keys结果断言为TaskType数组,再遍历 (Object.keys(comparisons) as TaskType[]).forEach(taskType => { const func = comparisons[taskType]; // 类型正确推断为Function });
方案2:在for...in循环中做正确的类型断言
export enum TaskType { Classification = 'classification', Extraction = 'extraction' } const comparisons: { [name in TaskType]: Function } = { 'classification': () => false, 'extraction': () => false } for (const taskType in comparisons) { // 断言为TaskType类型(枚举值)而非keyof TaskType(枚举键名) const func = comparisons[taskType as TaskType]; // 类型正确推断为Function }
内容的提问来源于stack exchange,提问作者simon
相关产品推荐
相关产品推荐

