TypeScript实现对象数组转强类型Map的泛型类型定义问题
问题原因与解决方案
1. TProperty推导为never的原因
你的泛型参数声明顺序和约束逻辑存在问题:你先声明了TObject extends {},又声明TArray extends TObject[],TypeScript的泛型推导优先级会先尝试匹配最顶层的泛型约束,此时TObject没有足够的输入推导具体类型,会被fallback到最宽泛的{}空对象类型,keyof {}本身就是never类型,因此继承了keyof TObject约束的TProperty自然就被推导为never。
2. 获取属性值类型的方法
你混淆了类型参数和值的用法:typeof操作符只能用于值来获取其类型,TProperty是泛型类型参数,本身就是类型,不能用typeof操作。要获取TObject对应属性的类型,直接用TypeScript的索引访问类型语法TObject[TProperty]即可。
修正后的类型定义
function convertArrayToMap<TObject extends object, TProperty extends keyof TObject>( inputArray: TObject[], property: TProperty ): Map<TObject[TProperty], TObject> { // 此处可补充你的实现逻辑 }
验证效果
调用示例代码时类型推导完全符合预期:
const myArray = [{ a: 'test', b: 1 }, { a: 'test1', b: 2 }]; const map = convertArrayToMap(myArray, 'a'); // map的类型自动推导为 Map<string, { a: string, b: number }> console.log(map.get('test').b); // 类型检查正常无报错,运行输出1
内容的提问来源于stack exchange,提问作者Adam Baranyai
相关产品推荐
相关产品推荐

