首页 > 解决方案 > 在Typescript中从对象数组到对象对象

问题描述

如果您有一个对象数组,并且您希望将数据转换为对象的对象,该对象的对象以数组中对象的给定键为键,那么类型的最佳用途是什么?

例如:

[
    {
        name: "alice", 
        id: "54dc2a",
        age: 23
    },
    {
        name: "bob",
        id: "662adf",
        age: 60
    }
]

您可以通过其中一个字段进行转换,例如convert(myArr, "name"). 结果可能是:

{
    "alice": {
        name: "alice", 
        id: "54dc2a",
        age: 23
    },
    "bob": {
        name: "bob",
        id: "662adf",
        age: 60
    }
}

我的第一次尝试,它给出了一个错误:

type Collection<T> = { [k: string]: T }

const convert = <T,>(arr: T[], key: string & keyof T) => {
    const obj: Collection<T> = {}
    arr.forEach((item) => {
      obj[item[key]] = item
    })
    return obj
}

标签: typescript

解决方案


这里的逻辑没有错,它适用于更具体的类型定义。问题是类型检查失败,因为 item[key] 中的值需要是字符串才能成为集合中的键,但由于 T 是通用的,因此无法保证。

我看不出有一种方法可以让它像现在一样通用,同时仍然确保任意键后面的值是一个字符串。除非您想出一个智能类型定义,否则您可能必须定义键,或使用//@ts-ignore来转义类型检查。


推荐阅读