TypeScript在Array.map中使用映射类型字典调用方法报never类型错误
问题原因
TypeScript 目前无法自动将联合类型 AllOperations 中的 operation 字段和 config 对象的索引类型做关联推导。config[mod.operation] 的参数类型和 mod 的类型会被当作两个独立的联合类型处理,二者的交集自然推导为 never,但实际代码逻辑是完全安全的。
解决方案
方案1:类型断言(适合快速修复)
直接对入参做类型断言,告诉 TypeScript 该参数符合对应函数的入参要求:
const contentList = content.map((mod) => { return config[mod.operation](mod as never); })
也可以写更严谨的断言形式:
const contentList = content.map((mod) => { return config[mod.operation](mod as Parameters<typeof config[typeof mod.operation]>[0]); })
方案2:封装通用调用函数(适合多次使用的场景)
封装一层通用调用函数,让 TypeScript 可以正确推导类型的对应关系:
function runOperation<T extends PossibleOperationEnum>(mod: Extract<AllOperations, { operation: T }>) { return config[mod.operation](mod); } const contentList = content.map(runOperation);
方案3:升级 TypeScript 版本
如果你使用的是 4.7 及以上版本的 TypeScript,编译器对这类联合类型和索引访问的关联推导做了专项优化,部分场景下无需额外处理即可正确识别类型对应关系。
内容的提问来源于stack exchange,提问作者Veljko Blagojevic
相关产品推荐
相关产品推荐

