【发布时间】:2020-12-10 18:13:37
【问题描述】:
我有一些包含数据库文档的对象,我经常需要将它们转换为数组。
例子:
const MY_OBJECT = {
docId_1: {...doc1},
docId_2: {...doc2},
docId_3: {...doc3},
// AND SO ON
}
我需要将它转换成这样的数组:
const MY_ARRAY_FROM_OBJECT = [
{...doc1},
{...doc2},
{...doc3},
// AND SO ON...
]
这是我用来进行转换的代码:
function buildArrayFromObject(obj) {
const keys = Object.keys(obj);
const arr = [];
for (const key of keys) {
arr.push(obj[key]);
}
return arr;
}
我需要键入该函数,以便可以将它与具有以下类型的对象一起使用:
interface BLOGPOSTS_ALL {
[key: string]: BLOGPOST
}
interface PRODUCTS_ALL {
[key: string]: PRODUCT
}
所以当我用每个不同的对象调用它们时,我希望 Typescript 知道返回的数组类型是什么。
例如:
const BLOGPOSTS_ALL_ARRAY = buildArrayFromObject(BLOGPOSTS_ALL); // SHOULD BE "BLOGPOST[]"
const PRODUCTS_ALL_ARRAY = buildArrayFromObject(PRODUCTS_ALL); // SHOULD BE "PRODUCT[]"
这是我尝试过的:
function buildArrayFromObject<T, K extends keyof T>(obj: T): T[K][] {
const keys = Object.keys(obj);
const arr = [];
for (const key of keys) {
arr.push(obj[key]);
}
return arr;
}
但我收到此错误:
Typescript 将函数的返回类型评估为类型never[]
【问题讨论】:
-
首先,有没有什么限制你使用
Object.values(..)这个功能? -
@r3dst0rm 没问题。我可以用那个。我只是习惯了
Object.keys() -
其实IE不支持
Object.values(),所以我宁愿用Object.keys() -
如另一条评论所述,您可以将 Object.keys 的返回值转换为以下内容:
const keys = Object.keys(obj) as K[];,一切顺利。
标签: arrays typescript function object typescript-typings