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
相关产品推荐
相关产品推荐

