Javascript Typescript抽象可选方法

Javascript Typescript抽象可选方法,javascript,typescript,Javascript,Typescript,我有一个抽象类和一些抽象方法。有没有办法将其中一些方法标记为可选的 abstract class Test { protected abstract optionalMethod?(): JSX.Element[]; protected abstract requiredMethod(): string; } 出于某些原因,我可以添加?作为后缀,但它似乎什么都不做,因为我仍然必须在派生类中实现该方法。现在我这样用它来标记它可以返回null,这基本上是穷人的选择 protecte

我有一个抽象类和一些抽象方法。有没有办法将其中一些方法标记为可选的

abstract class Test {
    protected abstract optionalMethod?(): JSX.Element[];
    protected abstract requiredMethod(): string;
}
出于某些原因,我可以添加
作为后缀,但它似乎什么都不做,因为我仍然必须在派生类中实现该方法。现在我这样用它来标记它可以返回
null
,这基本上是穷人的选择

protected abstract optionalMethod?(): JSX.Element[] | null;

抽象的概念未定义,但将在继承的类中。这就是为什么没有实现就不能有抽象方法的原因

我建议您创建已经在基类中实现的非抽象方法,以实现您的目标:

abstract class A {
    protected abstract requiredMethod(): string;
    protected emptyDefinition(): string | void {};
    protected optionalMethod(): string {
        return "something optional";
     };
}
class B extends A {
    protected requiredMethod(): string {
        return "something required";
    }
}

Typescript不支持“省略”可选抽象函数,但您可以显式地将其保留为未定义,如下所示:

抽象类测试{
受保护的抽象optionalMethod?():JSX.Element[];
受保护的抽象requiredMethod():字符串;
}
类MyTest扩展了测试{
受保护的可选方法:未定义;
受保护的requiredMethod():字符串{
返回“requiredResult”;
}
}

您可以使用
接口
合并:

接口Foo{
打印?(l:字符串):无效;
}
抽象类Foo{
抽象baz():void;
foo(){
this.print&&this.print('foo');
}
}
类栏扩展了Foo{
baz():void{
如果(本页打印){
这个。打印('bar');
}
}
}

我认为不支持可选的抽象方法。有关解决方法,请参阅和。正确答案是@idsblllp这是typescript的一个独特功能,但鲜为人知(当类和接口在同一文件中具有相同名称且都已导出时,将它们合并在一起)我想我可以在抽象方法名称中使用
操作符来欺骗自己。虽然这会起作用,但它需要知道抽象类的实现细节,以覆盖某些方法,这有点违背抽象类的全部目的。在这种情况下,您总是可以使用空定义进行欺骗:protectedoptionalMethod():字符串| void{};向上投票-这就是React.Component在我选中Thanks时的实现方式。这应该是可接受的答案-您应该明确说明Foo名称必须与接口和类名匹配。至少在TypeScript 3.8.3中(不知道何时第一次可用),您现在可以从子类中省略可选方法。默认情况下,它被视为未定义。