定义类型以将键入对象的数组转换为typescript中的索引对象

定义类型以将键入对象的数组转换为typescript中的索引对象,typescript,typescript-typings,Typescript,Typescript Typings,我想将{key:'A',value:'B'}数组转换为索引对象{A:{key:'A',value:'B'}。如何定义返回类型以反映结果对象 function toObject<T = any>(a: Iterable<T & { key }>): { [k in /* !!not like this!! */ keyof T]: T } { return [...a].reduce((a, v) => (a[v.key] = v, a), {}) as

我想将
{key:'A',value:'B'}
数组转换为索引对象
{A:{key:'A',value:'B'}
。如何定义返回类型以反映结果对象

function toObject<T = any>(a: Iterable<T & { key }>): { [k in /* !!not like this!! */ keyof T]: T } {
  return [...a].reduce((a, v) => (a[v.key] = v, a), {}) as any;
}

// Hope there is a hint for A and B
toObject([{key:'A',value:'B'},{key:'B'}]).A
函数toObject(a:Iterable):{[k in/*!!不是这样的!!*/keyof T]:T}{
返回[…a].reduce((a,v)=>(a[v.key]=v,a),{})如有;
}
//希望对a和B有个提示
toObject([{key:'A',value:'B'},{key:'B'}]).A
编辑

感谢@Niilo Keinänen,答案非常接近,我将param改为array,同样有效

const toObject = <K extends string, T = any>(arr: Array<T & { value: K }>): { [k in K]: T }  {
  const obj: any = { };
  arr.forEach(v => obj[v.value] = v);
  return obj;
}
constToObject=(arr:Array):{[k in k]:T}{
const obj:any={};
arr.forEach(v=>obj[v.value]=v);
返回obj;
}

我是否正确理解:

toObject({ key: 'first', value: 'second' })
= { first: 'second' } ?
这似乎是可行的:

const toObject = <K extends string, V, T extends { [P in K]: V }>(keyValuePair: { key: K, value: V }): T => {
    const obj: any = {}
    obj[keyValuePair.key] = keyValuePair.value
    return obj as T
}
constToObject=(keyValuePair:{key:K,value:V}):T=>{
const obj:any={}
obj[keyValuePair.key]=keyValuePair.value
返回obj作为T
}

也许你也可以以某种方式避免脏的任何类型,不确定。

所有键值对是否都具有相同类型的“值”(示例中为字符串)?@NiiloKeinänen值字段不重要,
toObject([{key:'first',value:'second'}])={first:{key:'first',value:'second'}