gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 20:56:24 25 4
gpt4 key购买 nike

在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 中做到这一点?我希望能够覆盖父类(super class)的静态方法并从子类中使用它,而无需在实例方法中重新定义引用。现在,我知道如何在 TypeScript 中访问静态方法的唯一方法是使用类名。

MainClass.info();

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

最佳答案

这个怎么样:

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接口(interface):

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";
}
}

关于typescript - 引用没有名称的类以在 TypeScript 的子类中使用不同的静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37727307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com