class A {
  n: number;
  constructor(n: number) {
    this.n = n;
  }
  clone(): A {
    return new this.constructor(this.n);
  }
  thisClone(): this {
    return new this.constructor(this.n);
  }
  badClone(): number {
    return new this.constructor(this.n); // Error A ~> number
  }
}

var a1 = new A(1);
var a2: A = new a1.constructor(2);
var a3: A = a2.clone();
