假设我们有一个数组,每个元素都是由它从键和值组成的对象。我们可以将这个数组转换为一个对象,其中对象的键是数组中每个对象的键,而对象的值是数组中每个对象的值。这个问题可以用以下代码解决:
type ArraytoObject<T> = {
[K in keyof T]: T[K] extends { key: infer K2; value: infer V } ? Record<K2, V> : never;
}[keyof T] & Record<string, unknown>;
function arrayToObject<T extends { key: string; value: any }>(arr: T[]): ArraytoObject<T> {
const obj: any = {};
arr.forEach(item => {
obj[item.key] = item.value;
return obj;
const arr = [{ key: "name", value: "Tom" }, { key: "age", value: 18 }];
const obj = arrayToObject(arr);
console.log(obj); // {name: "Tom", age: 18}
在上述代码中,我们首先定义了一个类型ArraytoObject
,它使用了条件类型,其中T[K] extends { key: infer K2; value: infer V }
表示T[K]是一个由key
和value
组成的对象类型。然后我们使用[keyof T]
来获取T
的所有键的联合类型,最终返回一个交叉类型与Record<string, unknown>
类型的对象。
随后,我们定义了一个arrayToObject
函数,接受一个由键值对组成的数组arr
,并循环遍历每一个元素,将它们的key
作为对象的键,将value
作为它们的值。最后返回一个转换完成的对象。
最后,我们创建了一个包含name
和age
属性的数组,并通过调用arrayToObject
函数将其转换为对象,并将其打印到控制台。