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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 02:05:19