引用没有名称的类,以在TypeScript中的子类中使用不同的静态方法

时间:2016-06-09 13:24:53

标签: typescript typescript1.8

在ES6中,您可以通过this.constructor引用静态方法:

class MainClass {
  static info() {
    return "This is some information";
  }
  constructor() {
    this.info = this.constructor.info(); // Allows subclass to define different '.info()' method.
  }
}

class ChildClass extends MainClass {
  static info() {
    return "This information is from the child";
  }

  constructor() {
    super();
  }
}

有没有办法在TypeScript中执行此操作?我希望能够覆盖超类的静态方法并从子类中使用它,而无需在实例方法中重新定义引用。现在,我知道如何在TypeScript中访问静态方法的唯一方法是使用类名。

MainClass.info();

但是如果我这样做,子类将继续使用MainClass.info();而不是它自己的.info()方法。

2 个答案:

答案 0 :(得分:3)

这个怎么样:

interface MainClassConstructor {
    new (): MainClass;
    info(): string;
}

class MainClass {
    static info() {
        return "This is some information";
    }

    private info: string;

    constructor() {
        this.info = (this.constructor as MainClassConstructor).info(); // Allows subclass to define different '.info()' method.
    }
}

class ChildClass extends MainClass {
    static info() {
        return "This information is from the child";
    }

    constructor() {
        super();
    }
}

code in playground

修改

您也可以使用typeof MainClass代替我添加的MainClassConstructor界面:

class MainClass {
    static info() {
        return "This is some information";
    }

    private info: string;

    constructor() {
        this.info = (this.constructor as typeof MainClass).info(); // Allows subclass to define different '.info()' method.
    }
}

此外,还有一个讨论/建议让this.constructor在此处返回正确的类型:T.constructor should be of type T

另一种选择是使用方法覆盖:

class MainClass {
    private info: string;

    constructor() {
        this.info = this.getInfo();
    }

    protected getInfo(): string {
        return "This is some information";
    }
}

class ChildClass extends MainClass {
    constructor() {
        super();
    }

    protected getInfo(): string {
        return "This information is from the child";
    }
}

答案 1 :(得分:2)

查看此打字稿代码:

class MainClass {
  static info() {
    return "This is some information";
  }
  info: string;

  constructor() {
    this.info = (this.constructor as any).info(); // Allows subclass to define different '.info()' method.
  }
}

class ChildClass extends MainClass {
  static info() {
    return "This information is from the child";
  }

  constructor() {
    super();
  }
}

如果编译目标是ES6,则编译为exaclty您上面提供的代码并且工作正常。如果将其编译为ES5,它也可以正常工作。

请注意,我使用了as any黑客来允许在.info()函数上调用constructor

或者,您可以覆盖每个子类中this.info的设置。这样你就不需要黑客了。