Javascript groupBy是类型脚本安全的

Javascript groupBy是类型脚本安全的,javascript,arrays,typescript,Javascript,Arrays,Typescript,给出了所有已经给出的答案,我们试图创建一个groupByarrow函数,它不会抱怨打字脚本错误。在我们的指导下,我们已经有了以下工作代码: const groupBy=( 项目:滴度[], 关键字:字符串 ):{[key:string]:TItem[]}=> 减少( (结果,项目)=>({ …结果, [项目[键]:[…(结果[项目[键]]| |[]),项目], }), {} ) 然而,它仍然抱怨: 确实可能使用的键为空/空白。所以这里的TypeScript没有错。所以在这种情况下,它应该简单

给出了所有已经给出的答案,我们试图创建一个
groupBy
arrow函数,它不会抱怨打字脚本错误。在我们的指导下,我们已经有了以下工作代码:

const groupBy=(
项目:滴度[],
关键字:字符串
):{[key:string]:TItem[]}=>
减少(
(结果,项目)=>({
…结果,
[项目[键]:[…(结果[项目[键]]| |[]),项目],
}),
{}
)
然而,它仍然抱怨:

确实可能使用的
为空/空白。所以这里的TypeScript没有错。所以在这种情况下,它应该简单地使用一个占位符值,比如
NA
或其他什么


为该
groupBy
函数创建可重用的无错误typescript版本的正确方法是什么?

使用一些泛型降低键类型并强制对象包含键:

type ObjectKey = string | number | symbol;

const groupBy = <K extends ObjectKey, TItem extends Record<K, ObjectKey>>(
  items: TItem[],
  key: K
): Record<ObjectKey, TItem[]> =>
  items.reduce(
    (result, item) => ({
      ...result,
      [item[key]]: [...(result[item[key]] || []), item],
    }),
    {} as Record<ObjectKey, TItem[]>
  );
type ObjectKey=string | number | symbol;
常量groupBy=(
项目:滴度[],
关键字:K
):记录=>
减少(
(结果,项目)=>({
…结果,
[项目[键]:[…(结果[项目[键]]| |[]),项目],
}),
{}作为记录
);

非常感谢!我自己也弄不明白。只要
ObjectKey
不为空,就可以很好地工作,但这很容易修复。