=== tests/cases/conformance/interfaces/declarationMerging/twoMergedInterfacesWithDifferingOverloads.ts === // interfaces that merge must not have members that conflict interface A { >A : A foo(x: number): number; >foo : { (x: number): number; (x: string): string; (x: Date): Date; } >x : number foo(x: string): string; >foo : { (x: number): number; (x: string): string; (x: Date): Date; } >x : string } interface A { >A : A foo(x: Date): Date; >foo : { (x: number): number; (x: string): string; (x: Date): Date; } >x : Date >Date : Date >Date : Date } interface B { >B : B >T : T foo(x: T): number; >foo : { (x: T): number; (x: string): string; (x: T): Date; (x: Date): string; } >x : T >T : T foo(x: string): string; >foo : { (x: T): number; (x: string): string; (x: T): Date; (x: Date): string; } >x : string } interface B { >B : B >T : T foo(x: T): Date; >foo : { (x: T): number; (x: string): string; (x: T): Date; (x: Date): string; } >x : T >T : T >Date : Date foo(x: Date): string; >foo : { (x: T): number; (x: string): string; (x: T): Date; (x: Date): string; } >x : Date >Date : Date } var b: B; >b : B >B : B var r = b.foo(true); // returns Date >r : Date >b.foo(true) : Date >b.foo : { (x: boolean): number; (x: string): string; (x: boolean): Date; (x: Date): string; } >b : B >foo : { (x: boolean): number; (x: string): string; (x: boolean): Date; (x: Date): string; } // add generic overload interface C { >C : C >T : T >U : U foo(x: T, y: U): string; >foo : { (x: T, y: U): string; (x: string, y: string): number; (x: W, y: W): W; } >x : T >T : T >y : U >U : U foo(x: string, y: string): number; >foo : { (x: T, y: U): string; (x: string, y: string): number; (x: W, y: W): W; } >x : string >y : string } interface C { >C : C >T : T >U : U foo(x: W, y: W): W; >foo : { (x: T, y: U): string; (x: string, y: string): number; (x: W, y: W): W; } >W : W >x : W >W : W >y : W >W : W >W : W } var c: C; >c : C >C : C >Date : Date var r2 = c.foo(1, 2); // number >r2 : number >c.foo(1, 2) : number >c.foo : { (x: boolean, y: Date): string; (x: string, y: string): number; (x: W, y: W): W; } >c : C >foo : { (x: boolean, y: Date): string; (x: string, y: string): number; (x: W, y: W): W; } // add generic overload that would be ambiguous interface D { >D : D >T : T >U : U a: T; >a : T >T : T b: U; >b : U >U : U foo(x: A, y: A): U; >foo : { (x: A, y: A): U; (x: W, y: W): T; } >A : A >x : A >A : A >y : A >A : A >U : U } interface D { >D : D >T : T >U : U foo(x: W, y: W): T; >foo : { (x: A, y: A): U; (x: W, y: W): T; } >W : W >x : W >W : W >y : W >W : W >T : T } var d: D; >d : D >D : D >Date : Date var r3 = d.foo(1, 1); // boolean, last definition wins >r3 : boolean >d.foo(1, 1) : boolean >d.foo : { (x: A, y: A): Date; (x: W, y: W): boolean; } >d : D >foo : { (x: A, y: A): Date; (x: W, y: W): boolean; }