typePredicateInherit.ts(11,3): error TS2416: Property 'method1' in type 'B' is not assignable to the same property in base type 'A'.
  Type '() => void' is not assignable to type '() => this is { a: 1; }'.
    Signature '(): void' must be a type predicate.
typePredicateInherit.ts(13,3): error TS2416: Property 'method2' in type 'B' is not assignable to the same property in base type 'A'.
  Type '() => void' is not assignable to type '() => boolean'.
    Type 'void' is not assignable to type 'boolean'.
typePredicateInherit.ts(15,3): error TS2416: Property 'method3' in type 'B' is not assignable to the same property in base type 'A'.
  Type '() => boolean' is not assignable to type '() => this is { a: 1; }'.
    Signature '(): boolean' must be a type predicate.
typePredicateInherit.ts(41,3): error TS2416: Property 'method1' in type 'D' is not assignable to the same property in base type 'C'.
  Type '() => void' is not assignable to type '() => this is { a: 1; }'.
    Signature '(): void' must be a type predicate.
typePredicateInherit.ts(50,3): error TS2416: Property 'method3' in type 'D' is not assignable to the same property in base type 'C'.
  Type '() => boolean' is not assignable to type '() => this is { a: 1; }'.
    Signature '(): boolean' must be a type predicate.


==== typePredicateInherit.ts (5 errors) ====
    interface A {
      method1(): this is {
        a: 1
      }
      method2(): boolean;
      method3(): this is {
        a: 1
      };
    }
    class B implements A {
      method1() { }      // should error
      ~~~~~~~
!!! error TS2416: Property 'method1' in type 'B' is not assignable to the same property in base type 'A'.
!!! error TS2416:   Type '() => void' is not assignable to type '() => this is { a: 1; }'.
!!! error TS2416:     Signature '(): void' must be a type predicate.
    
      method2() { }   // should error
      ~~~~~~~
!!! error TS2416: Property 'method2' in type 'B' is not assignable to the same property in base type 'A'.
!!! error TS2416:   Type '() => void' is not assignable to type '() => boolean'.
!!! error TS2416:     Type 'void' is not assignable to type 'boolean'.
    
      method3() {   // should error
      ~~~~~~~
!!! error TS2416: Property 'method3' in type 'B' is not assignable to the same property in base type 'A'.
!!! error TS2416:   Type '() => boolean' is not assignable to type '() => this is { a: 1; }'.
!!! error TS2416:     Signature '(): boolean' must be a type predicate.
        return true
      }
    }
    
    class C {
      method1(): this is {
        a: 1
      } {
        return true;
      }
    
      method2(): this is {
        a: 1
      } {
        return true;
      }
    
      method3(): this is {
        a: 1
      } {
        return true;
      }
    }
    
    class D extends C {
      method1(): void {   // should error
      ~~~~~~~
!!! error TS2416: Property 'method1' in type 'D' is not assignable to the same property in base type 'C'.
!!! error TS2416:   Type '() => void' is not assignable to type '() => this is { a: 1; }'.
!!! error TS2416:     Signature '(): void' must be a type predicate.
      }
    
      method2(): this is {  // should ok
        a: 1
      } {
        return true;
      }
    
      method3(): boolean {  // should error
      ~~~~~~~
!!! error TS2416: Property 'method3' in type 'D' is not assignable to the same property in base type 'C'.
!!! error TS2416:   Type '() => boolean' is not assignable to type '() => this is { a: 1; }'.
!!! error TS2416:     Signature '(): boolean' must be a type predicate.
        return true;
      }
    }