我正在寻找一种在abstract static
中实现TypeScript方法的方法。
这里有一个例子:
abstract class A {
abstract static b (): any // error
}
class B extends A {
static b () {}
}
这在public
、private
和protected
方法中是允许的,但对于static
方法则不允许。TypeScript返回以下错误:
‘静态’修饰符不能与‘抽象’modifier.ts一起使用(1243)
有什么解决办法吗?
发布于 2022-06-09 13:19:16
我认为理由大致如下:
抽象基类
抽象类Foo { bar() {返回this.baz() + 1;}抽象baz():int;}
函数(foo: Foo) { let val = foo.bar();.}
根据您得到的Foo
的具体子类,这里的结果将有所不同,但所有这些都保证能够工作。
现在,使用static
方法会是什么样的呢?
abstract class Foo {
static bar() {
return this.baz() + 1;
}
abstract static baz(): int;
}
function (F: typeof Foo) {
let val = F.bar();
...
}
这看上去有点合乎逻辑,而且应该有效,不是吗?但是:
如果您编写这个
typeof
类型。那么,为什么呢?如果您从未实例化类,那么类的意义是什么呢?如果您的F
**,方法确实实例化了一个对象,那么如果它充当一个完全合法的替代构造函数,那么调用F.bar()
来获取一个新实例,您会期望得到要在这里重新表述这条争论链:
如果要使用class.
F.bar()
而没有得到确切的F
实例是…奇怪吗?如果要在类上调用静态替代构造函数,那么就需要对特定的类调用它们,而不是像上面所示的变量,因为否则您将不知道得到的是什么(参见above).abstract static
方法没有真正的用例,无论是作为直接的替代构造函数还是作为一个辅助函数,因为这会导致以某种方式违反上述点之一,)。
据我所见,这几乎是导致abstract static
方法不是一件事的经典思想。某些technical limitations in Java可能对此作出了贡献,并且/或首先导致了上述技术限制。
在Javascript中,人们可能会认为这不太合理,因为即使是类也是对象,像上面所描述的那样使用它们是完全可行的,而且在某些情况下甚至可能是有意义的。但我们到了。
https://stackoverflow.com/questions/72557768
复制相似问题