interface Some {} interface Other { x: X; } interface None {} interface Nada { y: Y } interface A { foo(s: Some, e: None): A; foo(s: Some, e: Nada): A; foo(s: Other, e: None): A; foo(s: Other, e: Nada): A; } interface B extends A { foo(s: Some, e: None): B; foo(s: Some, e: Nada): B; foo(s: Other, e: None): B; foo(s: Other, e: Nada): B; }