[英]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;
您可以通过class
和interface
合并来做到这一点:
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');
}
}
}
抽象的概念是未定义但将在继承的类中的东西。 这就是为什么我们不能有没有实现的抽象方法。
我建议你创建已经在你的基类中实现的非抽象方法来实现你的目标:
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.