interface Array { groupBy(predicate: (item: T) => TKey): GroupedItem[]; orderBy(predicate: (value: T) => unknown, direction?: 'asc' | 'desc'): T[]; select(predicate: (value: T, index: number, array: T[]) => U): U[]; sum(predicate: (value: T, index: number, array: T[]) => number): number; first(predicate?: (value: T, index: number, array: T[]) => boolean, defaultValue?: T): T | undefined; last(predicate?: (value: T, index: number, array: T[]) => boolean, defaultValue?: T): T | undefined; chunk(perChunk: number): T[][]; } interface GroupedItem { key: TKey; values: TElement[]; }