我正在寻找一种在TypeScript中实现abstract static
方法的方法。
下面是一个例子:
abstract class A {
abstract static b (): any // error
}
class B extends A {
static b () {}
}
public
、private
和protected
方法允许这样做,但static
方法不允许。TypeScript返回以下错误:
“static”修饰符不能与“abstract”修饰符一起使用。ts(1243)
是否有变通方法?
2条答案
按热度按时间nhaq1z211#
我认为其理由大致如下:
这里的结果会有所不同,这取决于您得到的
Foo
的具体子类,但它都保证可以工作。现在,使用
static
方法会是什么样子?这看起来有点合乎逻辑,好像它应该工作,不是吗?但是:
typeof
类型之外,传递类的示例基本上没有区别。那为什么static
方法 * 确实 * 示例化了一个对象,如果它充当了一个 * 替代构造函数 *--这是完全合法的--那么调用F.bar()
来获取一个新的示例,**你会期望得到一个F
的示例,**但你可能会得到它的某个子类的示例。这是不可取的。在此重新表述一下这一论证链:
static
方法,它们应该充当替代构造函数并返回一个示例,否则它们作为类的一部分就没有什么意义。F.bar()
而没有得到一个完全是F
的示例是......奇怪吗?abstract static
方法没有真实的的用例,无论是作为直接的替代构造函数还是作为辅助函数,因为这将导致以某种方式违反上述任何一点。据我所知,这几乎是导致
abstract static
方法不存在的经典思想。某些technical limitations in Java可能促成了这一点和/或首先导致了上述技术限制。在JavaScript中,人们可以争辩说这没有什么意义,因为即使是类也是对象,并且如上所述使用它们是完全可行的,并且在某些情况下甚至可能有意义。但我们到了这里。
1mrurvl12#
我用下面的方法解决了这个问题:
这显然与抽象静态类不同,但根据您要使用它做什么,这可能是一个很好的解决方案!