繁体   English   中英

Typescript 抽象可选方法

[英]Typescript abstract optional method

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

abstract class Test {
    protected abstract optionalMethod?(): JSX.Element[];
    protected abstract requiredMethod(): string;
}

出于某些原因,我可以添加? 作为后缀,但它似乎什么都不做,因为我仍然必须在派生的 class 中实现该方法。现在我像这样使用它来标记它可以返回null ,这基本上是穷人可选的。

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

您可以通过classinterface合并来做到这一点:

interface Foo {
   print?(l: string): void;
}

abstract class Foo {
  abstract baz(): void;

  foo() {
    this.print && this.print('foo');
  }
}

class Bar extends Foo {
  baz(): void {
    if (this.print) {
      this.print('bar');
    }
  }
}

链接到 Typescript 游乐场中的上述代码

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

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

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 不支持可选抽象函数的“省略”,但您可以明确地将其保留为未定义,如下所示:

abstract class Test {
    protected abstract optionalMethod?(): JSX.Element[];
    protected abstract requiredMethod(): string;
}

class MyTest extends Test {
    protected optionalMethod: undefined;

    protected requiredMethod(): string {
        return 'requiredResult';
    }
}

我不确定这是否在某个时候发生了变化,但是今天(TS 4.3)您可以简单地使基类可选方法非抽象:

abstract class Base {
    protected abstract required(): void;
    protected optional?(): string;

    print(): void {
        console.log(this.optional?.() ?? "Base");
    }
}

class Child1 extends Base {
    protected required(): void { }
}

class Child2 extends Base {
    protected required(): void { }
    protected optional(): string {
        return "Child";
    }
}

const c1 = new Child1();
c1.print();

const c2 = new Child2();
c2.print();

TS Playground上试一试。

您不需要界面合并。 您只需要使用没有默认实现的重载方法,如下所示:

abstract class Test {
    ...
    private someMethod() {
       ...
       this.optinalMethod?.();
    }
    ...
    protected abstract requiredMethod(): string;
    protected optionalMethod?(): string;
}

abstract 表示它必须在实现 class 中被覆盖。但是,在可选方法的情况下,我们不想强制覆盖它。

这已经存在了一段时间,但上面的回答是正确的,但这个例子并不清楚。 您也可以像这样使用界面合并。

interface Test {
    optionalMethod?(): JSX.Element[];
}

abstract class Test {
    protected abstract requiredMethod(): string;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM