typescript - 在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
}
解决方案
这里的逻辑没有错,它适用于更具体的类型定义。问题是类型检查失败,因为 item[key] 中的值需要是字符串才能成为集合中的键,但由于 T 是通用的,因此无法保证。
我看不出有一种方法可以让它像现在一样通用,同时仍然确保任意键后面的值是一个字符串。除非您想出一个智能类型定义,否则您可能必须定义键,或使用//@ts-ignore
来转义类型检查。
推荐阅读
- python - 使用 python 绕过 Telegram 和 Whatsapp 自动化电话号码禁令
- xmlhttprequest - 柏树 - 存根?页面刷新和更改查询的 API 调用
- ios - 使用 NavigationView 和工作表删除元素时 ForEach 崩溃
- html - 溢出 x 时边框不会是全宽
- android - 从已弃用的 jcenter 迁移 - Google Places 库的问题
- reactjs - ReactJs 导航链接
- icons - 如何在 Mapbox GL JS 中将图标添加到没有 geojsonlayer 的标记
- php - 没有打开wordpress管理面板的wordpress登录用户
- html - 是什么导致网格边框和网格内容之间的间距变窄,我该如何密封它?
- python - 使用 Jupyter 笔记本从 wiki 转储文件创建语料库