The approach is interesting but the syntax makes it hard to use. Why not make the first arguments the types like one would expect?
T([Number, Number])(function(x) { return x; })
For this method, a function type is defined and then serves as a constructor that accepts a function as argument.