Typescript抽象可选方法

时间:2017-05-24 08:46:34

标签: javascript typescript

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

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

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

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

4 个答案:

答案 0 :(得分:5)

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

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

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";
    }
}

答案 1 :(得分:1)

我不确定这是否在某个时候发生了变化,但是今天(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 上试试。

答案 2 :(得分:0)

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';
    }
}

答案 3 :(得分:0)

您可以通过类和接口合并来做到这一点:

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');
    }
  }
}

payground