type Merge = (a: T, b: T) => T; // hypothetical immutable map declare class Map { (): Map; insertWith(fn: Merge, k: K, v: V): Map; } declare function foldr(fn: (a: A, b: B) => B, b: B, as: A[]): B; function insertMany(merge: Merge, vs: [K,V][], m: Map): Map { function f([k,v]: [K,V], m: Map): Map { return m.insertWith(merge, k, v) } return foldr(f, m, vs) } class Foo { bar() { return function(a: A, b: B, c: C): void { ([a,b,c] : [A,B,C]); } } }