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