=== tests/cases/compiler/overloadBindingAcrossDeclarationBoundaries.ts === interface Opt1 { >Opt1 : Opt1 p?: any; >p : any } interface Opt2 { >Opt2 : Opt2 q?: any; >q : any } interface Opt3 { >Opt3 : Opt3 r?: any; >r : any } interface Opt4 { >Opt4 : Opt4 s?: any; >s : any } interface A { >A : A a(o: Opt1): Opt1; >a : { (o: Opt1): Opt1; (o: Opt2): Opt2; (o: Opt3): Opt3; (o: Opt4): Opt4; } >o : Opt1 >Opt1 : Opt1 >Opt1 : Opt1 a(o: Opt2): Opt2; >a : { (o: Opt1): Opt1; (o: Opt2): Opt2; (o: Opt3): Opt3; (o: Opt4): Opt4; } >o : Opt2 >Opt2 : Opt2 >Opt2 : Opt2 (o: Opt1): Opt1; >o : Opt1 >Opt1 : Opt1 >Opt1 : Opt1 (o: Opt2): Opt2; >o : Opt2 >Opt2 : Opt2 >Opt2 : Opt2 new (o: Opt1): Opt1; >o : Opt1 >Opt1 : Opt1 >Opt1 : Opt1 new (o: Opt2): Opt2; >o : Opt2 >Opt2 : Opt2 >Opt2 : Opt2 } interface A { >A : A a(o: Opt3): Opt3; >a : { (o: Opt1): Opt1; (o: Opt2): Opt2; (o: Opt3): Opt3; (o: Opt4): Opt4; } >o : Opt3 >Opt3 : Opt3 >Opt3 : Opt3 a(o: Opt4): Opt4; >a : { (o: Opt1): Opt1; (o: Opt2): Opt2; (o: Opt3): Opt3; (o: Opt4): Opt4; } >o : Opt4 >Opt4 : Opt4 >Opt4 : Opt4 (o: Opt3): Opt3; >o : Opt3 >Opt3 : Opt3 >Opt3 : Opt3 (o: Opt4): Opt4; >o : Opt4 >Opt4 : Opt4 >Opt4 : Opt4 new (o: Opt3): Opt3; >o : Opt3 >Opt3 : Opt3 >Opt3 : Opt3 new (o: Opt4): Opt4; >o : Opt4 >Opt4 : Opt4 >Opt4 : Opt4 } var a: A; >a : A >A : A // These should all be Opt3 var a1 = a.a({}); >a1 : Opt3 >a.a({}) : Opt3 >a.a : { (o: Opt1): Opt1; (o: Opt2): Opt2; (o: Opt3): Opt3; (o: Opt4): Opt4; } >a : A >a : { (o: Opt1): Opt1; (o: Opt2): Opt2; (o: Opt3): Opt3; (o: Opt4): Opt4; } >{} : {} var a1 = a({}); >a1 : Opt3 >a({}) : Opt3 >a : A >{} : {} var a1 = new a({}); >a1 : Opt3 >new a({}) : Opt3 >a : A >{} : {}