class Generic { clone(): Generic { return this; } } class Implicit { arg: X; val: X; } class ImplicitNumber extends Implicit { arg: number; } (new ImplicitNumber().val: string) // error: number ~> string