//// [promiseTypeInference.ts] declare class Promise { then(success?: (value: T) => Promise): Promise; } interface IPromise { then(success?: (value: T) => IPromise): IPromise; } declare function load(name: string): Promise; declare function convert(s: string): IPromise; var $$x = load("something").then(s => convert(s)); //// [promiseTypeInference.js] var $$x = load("something").then(function (s) { return convert(s); });