export function groupIn>( array: T[], keyOrGetter: Key, ): Record export function groupIn( array: T[], keyOrGetter: (item: T) => KeyReturnT, ): KeyReturnT extends string | number ? Record : never export function groupIn(array: T[], keyOrGetter: Key) { let kv return array.reduce((r, a) => { kv = typeof keyOrGetter === 'function' ? keyOrGetter(a) : a[keyOrGetter as unknown as keyof T] // @ts-ignore r[kv] = a return r }, {}) } export function groupBy>( array: T[], keyOrGetter: Key, ): Record export function groupBy( array: T[], keyOrGetter: (item: T) => KeyReturnT, ): KeyReturnT extends string | number ? Record : never export function groupBy(array: T[], keyOrGetter: Key) { let kv return array.reduce((r, a) => { kv = typeof keyOrGetter === 'function' ? keyOrGetter(a) : a[keyOrGetter as unknown as keyof T] // @ts-ignore r[kv] = [...(r[kv] || []), a] return r }, {}) }