interface Promise { then(cb: (x: T) => Promise): Promise; } interface CPromise { then(cb: (x: T) => Promise): Promise; } interface Foo { x; } interface Bar { x; y; } var a: Promise; var b: Promise; a = b; // ok b = a; // ok var a2: CPromise; var b2: CPromise; a2 = b2; // ok b2 = a2; // was error