首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >TypeScript中的抽象静态方法

TypeScript中的抽象静态方法
EN

Stack Overflow用户
提问于 2022-06-09 09:21:24
回答 1查看 397关注 0票数 0

我正在寻找一种在abstract static中实现TypeScript方法的方法。

这里有一个例子:

代码语言:javascript
运行
复制
abstract class A {
  abstract static b (): any // error
}

class B extends A {
  static b () {}
}

这在publicprivateprotected方法中是允许的,但对于static方法则不允许。TypeScript返回以下错误:

‘静态’修饰符不能与‘抽象’modifier.ts一起使用(1243)

有什么解决办法吗?

EN

Stack Overflow用户

发布于 2022-06-09 13:19:16

我认为理由大致如下:

  • 抽象方法是一个具体子类应该实现的占位符。

抽象基类

  • 将有一个使用此抽象占位符的具体方法,因此需要实现它;没有这个方法,抽象方法就毫无意义。例如:

抽象类Foo { bar() {返回this.baz() + 1;}抽象baz():int;}

  • 只能在一个具体实例上调用,例如:

函数(foo: Foo) { let val = foo.bar();.}

根据您得到的Foo的具体子类,这里的结果将有所不同,但所有这些都保证能够工作。

现在,使用static方法会是什么样的呢?

代码语言:javascript
运行
复制
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.

  • Alternative方法,则它们应该充当替代构造函数并返回实例,否则,作为构造函数的一部分,它们应该返回您调用它们的类的实例。调用F.bar()而没有得到确切的F实例是…奇怪吗?如果要在类上调用静态替代构造函数,那么就需要对特定的类调用它们,而不是像上面所示的变量,因为否则您将不知道得到的是什么(参见above).
  • Therefore,点,abstract static方法没有真正的用例,无论是作为直接的替代构造函数还是作为一个辅助函数,因为这会导致以某种方式违反上述点之一,

)。

据我所见,这几乎是导致abstract static方法不是一件事的经典思想。某些technical limitations in Java可能对此作出了贡献,并且/或首先导致了上述技术限制。

在Javascript中,人们可能会认为这不太合理,因为即使是类也是对象,像上面所描述的那样使用它们是完全可行的,而且在某些情况下甚至可能是有意义的。但我们到了。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72557768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档