TypeScript:如何在对象映射器中实现类型收窄?
解决TypeScript中函数参数类型不匹配问题
你的核心问题是:Record<Filter, (value: string | string[]) => string>要求每个函数都能接收string或string[]类型的参数,但实际每个函数只处理其中一种类型。TypeScript报错的原因是函数参数类型具有逆变特性——只能用更宽泛的参数类型适配更窄的,反过来不行(比如只接受string的函数无法处理传入的string[])。
不用将参数设为unknown(那样会丢失类型检查能力),可以通过映射类型给每个Filter成员绑定对应的参数类型,让TypeScript明确每个键对应的函数参数类型:
1. 定义Filter类型与参数映射
// 先定义Filter的可选值范围 type Filter = 'contains' | 'between'; // 为每个Filter指定专属的参数类型 type FilterParamMap = { contains: string; between: string[]; };
2. 用映射类型定义myMapper
const myMapper: { [K in Filter]: (value: FilterParamMap[K]) => string; } = { contains: (value) => `do something with ${value}`, between: ([value1, value2]) => `something with ${value1} and ${value2}`, };
这样处理后,TypeScript会自动推断每个函数的参数类型,调用时如果传入错误类型会直接抛出提示(比如给contains传数组、给between传单个字符串),既保证了类型安全,又符合你对参数类型匹配的要求。
内容的提问来源于stack exchange,提问作者sir-haver
相关产品推荐
相关产品推荐

