【问题标题】:Change return value of super class' static constructor [duplicate]更改超类的静态构造函数的返回值
【发布时间】:2020-02-03 09:26:05
【问题描述】:

我想通过只添加一个新的(非静态)函数来扩展一个类,而不更改构造函数。我的超类只能由静态函数构造。现在,当我使用该静态函数构造子类时,我收到一个作为超类实例的对象,尽管我想要子类。在不更改超类的情况下,我可以做些什么来实现我正在寻找的东西?

这是一个最小的例子:

class MySuperClass {
    static staticConstructor() {
        return new MySuperClass()
    }
}

class MySubClass extends MySuperClass {
    addedFunction() {}
}

const mySuperClass = MySuperClass.staticConstructor()
console.log(mySuperClass instanceof MySuperClass) // true

const mySubClass = MySubClass.staticConstructor()
console.log(mySubClass instanceof MySubClass) // false, I want this to be true
console.log(mySubClass instanceof MySuperClass) // true

// calling mySubClass.addedFunction results in an error due to wrong instance

PS:我在这里找不到解决方案,但我很确定应该有一个。每次搜索都会导致一些我显然不想要的 DOM 操作。

【问题讨论】:

  • staticConstructor 应该使用return new this()
  • 该死,我觉得自己很笨。谢谢,有帮助!你知道如何在 Typescript 中正确输入 staticConstructor 的返回值吗?我想这仅对使用泛型或任何方法的子类是正确的?
  • 是的,我怀疑你需要泛型。有一些与此相关的 TypeScript 问题,例如github.com/Microsoft/TypeScript/issues/18685

标签: javascript typescript es6-class


【解决方案1】:

您的问题是由于您的静态构造函数将始终返回 SuperClass 的实例,无论您创建什么子类。要让您的第二个console.log 返回 true,您需要将静态构造函数代码替换为 return new this()

【讨论】:

  • 谢谢。你知道我如何在 Typescript 中正确输入 staticConstructor 的返回值吗?这只能通过使用泛型来实现吗?
  • 泛型是什么意思?如果我没记错的话,它是否与 TS 中的 any 关键字有关?
  • 我输入了这个<T extends MySuperClass 以正确键入我的构造函数的返回值:typescriptlang.org/play/…
  • 不幸的是,我在 TypeScript 方面不够熟练,无法回答您的问题。你可以参考@Bergi,他提供给你的链接,甚至为此创建一个新问题。
猜你喜欢
  • 2016-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
  • 2013-07-10
  • 2011-10-07
  • 2018-01-12
相关资源
最近更新 更多