interface Sequence { each(iterator: (value: T) => void): void; map(iterator: (value: T) => U): Sequence; filter(iterator: (value: T) => boolean): Sequence; groupBy(keySelector: (value: T) => K): Sequence<{ key: K; items: T[]; }>; } var s: Sequence; var s2 = s.groupBy(s => s.length); var s3 = s2.each(x => { x.key /* Type is K, should be number */ });