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

Typescript 如何为带Map属性的接口定义提取Map值类型的泛型函数

解决思路

核心是从目标属性对应的Map类型中提取值类型,通过TypeScript的条件类型+infer关键字可以实现该类型提取需求,让val的类型和对应Map的值类型自动绑定。

正确实现代码
interface Data {
  map1: Map<string, number>;
  map2: Map<string, string>;
}

const d: Data = {
  map1: new Map(),
  map2: new Map(),
};

// 工具类型:提取Map<string, V>结构中的值类型V
type ExtractMapValue<T> = T extends Map<string, infer V> ? V : never;

// 正确的泛型函数定义
function dataSet<T extends keyof Data>(
  d: Data,
  dataKey: T,
  key: string,
  val: ExtractMapValue<Data[T]>
) {
  d[dataKey].set(key, val);
}

// 调用符合预期,类型校验正常生效
dataSet(d, 'map1', 'alpha', 3);
dataSet(d, 'map2', 'beta', 'charlie');
校验说明
  • 传入map1作为dataKey时,val会自动限定为number类型,传入字符串会触发类型报错
  • 传入map2作为dataKey时,val会自动限定为string类型,传入数字会触发类型报错
  • 所有内置Map方法的类型校验都可以正常生效

内容的提问来源于stack exchange,提问作者BrainCore

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 11:15:03