groupBy 是 TypeScript 安全的

Dar*_*te1 3 javascript arrays typescript

考虑到所有已经存在的答案,我们尝试创建一个groupBy不会抱怨 TypeScript 错误的箭头函数。在这个答案这个答案的指导下,我们已经有了这个工作代码:

const groupBy = <TItem>(
  items: TItem[],
  key: string
): { [key: string]: TItem[] } =>
  items.reduce(
    (result, item) => ({
      ...result,
      [item[key]]: [...(result[item[key]] || []), item],
    }),
    {}
  )
Run Code Online (Sandbox Code Playgroud)

然而,它仍然抱怨: 元素隐式具有“any”类型,因为“string”类型的表达式不能用于索引类型“unknown”。 在“未知”类型上找不到带有“字符串”类型参数的索引签名。

使用的确实有可能key是空的/空白的。所以TypeScript在这里并没有错。因此,在这种情况下,它应该简单地使用占位符值之类的NA东西。

为此函数创建可重用的无错误打字稿版本的正确方法是什么groupBy

Apl*_*123 5

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

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[]>
  );
Run Code Online (Sandbox Code Playgroud)

游乐场链接