interface IEnumerable { zip(second: IEnumerable, resultSelector: (first: T, second: T, index: number) => TResult): IEnumerable; zip(second: T[], resultSelector: (first: T, second: T, index: number) => TResult): IEnumerable; zip(...params: any[]): IEnumerable; // last one is selector merge(...params: IEnumerable[]): IEnumerable; merge(...params: T[][]): IEnumerable; concat(...sequences: IEnumerable[]): IEnumerable; concat(...sequences: T[]): IEnumerable; insert(index: number, second: IEnumerable): IEnumerable; sequenceEqual(second: IEnumerable): boolean; sequenceEqual(second: IEnumerable, compareSelector: (element: T) => TCompare): boolean; sequenceEqual(second: T[]): boolean; sequenceEqual(second: T[], compareSelector: (element: T) => TCompare): boolean; toDictionary(keySelector: (element: T) => TKey): IDictionary; toDictionary(keySelector: (element: T) => TKey, elementSelector: (element: T) => TValue): IDictionary; toDictionary(keySelector: (element: T) => TKey, elementSelector: (element: T) => TValue, compareSelector: (key: TKey) => TCompare): IDictionary; } interface IDictionary { toEnumerable(): IEnumerable<{ key: TKey; value: TValue }>; }