Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 接收类型为“[key:string]:SOME_type”的对象并返回类型为“SOME_type[]的数组的函数的类型`_Arrays_Typescript_Function_Object_Typescript Typings - Fatal编程技术网

Arrays 接收类型为“[key:string]:SOME_type”的对象并返回类型为“SOME_type[]的数组的函数的类型`

Arrays 接收类型为“[key:string]:SOME_type”的对象并返回类型为“SOME_type[]的数组的函数的类型`,arrays,typescript,function,object,typescript-typings,Arrays,Typescript,Function,Object,Typescript Typings,我有一些对象包含我经常需要转换为数组的DB文档 例如: 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... ] 这是我用来进行转换的代

我有一些对象包含我经常需要转换为数组的DB文档

例如:

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;
}
函数buildArrayFromObject(obj:T):T[K][]{
常量键=对象键(obj);
常数arr=[];
for(键的常数键){
arr.push(对象[键]);
}
返回arr;
}
但我得到了一个错误:


Typescript将函数的返回类型评估为type
never[]

您可以执行以下操作:

创建抽象类型以定义数据库句柄的外观:

//创建实体类型以定义数据库对象的外观
类型实体={[key:string]:T |未定义}
因此,您可以这样表达您的产品和博客帖子:

const MY_ARRAY_FROM_OBJECT = [
  {...doc1}, 
  {...doc2}, 
  {...doc3},
  // AND SO ON...
]
type BLOGPOSTS=实体;
类型产品=实体;
为了以类型安全的方式将它们转换为数组,您可以使用JavaScript API提供的
Object.values
方法-有关更多信息,请参阅

可以将方法
buildArrayFromObject
替换为以下内容:

const MY_ARRAY_FROM_OBJECT = [
  {...doc1}, 
  {...doc2}, 
  {...doc3},
  // AND SO ON...
]
const isNil=(a:T | null | undefined):a为null | undefined=>a==null | | a==undefined;
常量isAssigned=(a:T | null |未定义):a是T=>!isNil(a);
常量entitiesToArray=(实体:实体):T[]=>Object.values(实体).filter(isAssigned);
此方法使用
Object.values
方法将对象转换为数组。之后,它将被过滤以包含一个没有未定义值的数组。因此,我使用了两个helper方法
isAssigned
isNil
。有关示例,请参见此代码沙盒:

考虑到IE11不支持Object.value方法,您可以为该方法添加一个多边形填充。通过粘贴多边形填充或使用npm将其添加到项目中。
或者,您可以用以下答案替换此代码。

首先,是否有限制您使用函数
对象。值(…)
?@r3dst0rm没有问题。我可以用这个。我只是习惯了
Object.keys()
事实上,
Object.values()
不受IE支持,所以我宁愿使用
Object.keys()
正如另一条评论中所指出的,您可以将Object.keys的返回值强制转换为以下内容:
const keys=Object.keys(obj)作为K[]你可以走了。非常感谢你的回答。我正在寻找一种更简单的方法来解决这个问题。如果我决定只将此函数用于这两种对象类型:
BLOGPOSTS\u ALL
PRODUCTS\u ALL
,该怎么办。因此,我不必使函数“太”通用。有什么方法可以简化这件事吗?事实上有。如果没有问题,您可以在解决方案中将
Object.keys
的返回值强制转换为如下:
const keys=Object.keys(obj)为K[]然后这个问题神奇地消失了,我的答案将是一个很好的附录。如果有帮助,请告诉我