interface IFoo { foo(x: T): T; // no error on implementors because IFoo's T is different from foo's T } class IntFooBad implements IFoo { foo(x: string): string { return null; } } class StringFoo2 implements IFoo { foo(x: string): string { return null; } } class StringFoo3 implements IFoo { foo(x: T): T { return null; } }